3

我发现人们使用这种方法来获取当前脚本位置的路径:

    _getScriptLocation: (function() {
        var r = new RegExp("(^|(.*?\\/))(" + scriptName + ")(\\?|$)"),
            s = document.getElementsByTagName('script'),
            src, m, l = "";
        for(var i=0, len=s.length; i<len; i++) {
            src = s[i].getAttribute('src');
            if(src) {
                m = src.match(r);
                if(m) {
                    l = m[1];
                    break;
                }
            }
        }
        return (function() { return l; });
    })(),

完整代码在这里。

但我不知道为什么它使用自执行匿名函数?

为什么不改用这个:

_getScriptLocation: function() {
    var r = new RegExp("(^|(.*?\\/))(" + scriptName + ")(\\?|$)"),
        s = document.getElementsByTagName('script'),
        src, m, l = "";
    for(var i=0, len=s.length; i<len; i++) {
        src = s[i].getAttribute('src');
        if(src) {
            m = src.match(r);
            if(m) {
                l = m[1];
                break;
            }
        }
    }
    return l;
}
4

3 回答 3

3

在第一个(自执行函数)中,函数的过程只执行一次,所以:

APP._getScriptLocation();
APP._getScriptLocation();
APP._getScriptLocation();

只是l为每个调用返回(该过程将永远不会再次执行 - 它只是在脚本加载后执行:因为它是一个自执行函数)。

但在第二个中,每当您调用您的方法时:

APP._getScriptLocation();

您一次又一次地执行所有过程,在这种情况下不需要。

于 2013-06-06T02:56:12.907 回答
1

第一个创建一个匿名函数,它只返回当前脚本的位置。该位置仅计算一次,并且是函数返回的静态字符串。

第二个每次调用时都会重新计算位置。虽然它们产生相同的结果,但第二个会比第一个慢得多,这实际上只是一个return声明。

于 2013-06-06T02:57:23.297 回答
0

由于作用域,这样做不会创建另一个保留在全局作用域中的函数。如果您创建了一个具有名称的函数,它将作为一个对象保留在 globa 范围内,而且您还需要调用它。这里有一个很好的阅读。http://helephant.com/2008/08/23/javascript-anonymous-functions/

于 2013-06-06T02:47:35.317 回答