3

函数的放置是否会影响范围内闭包的性能?如果是这样,放置这些功能的最佳位置在哪里?如果不是,那么闭包的隐含关联是否足以在逻辑上将函数放置在另一个地方?

例如,如果foo不依赖于 localState 的值,那么localState可以从foo访问这一事实是否会对foo的执行时间、内存使用等产生影响?

(function(){
    var localState;

    function foo(){
        // code
    }

    function bar(){
        // code
        return localState;
    }
})();

换句话说,这会是一个更好的选择吗?如果是,为什么?

(function(){
    function foo(){
        // code
    }

    var localState;

    function bar(){
        // code
        return localState;
    }
})();

Darius Bacon在下面建议,上面的两个示例是相同的,因为可以从块内的任何位置访问localState 。但是,下面的示例foo在块外定义可能是不同的情况。你怎么看?

function foo(){
    // code
}

(function(){

    var localState;

    function bar(){
        // code
        foo();
        return localState;
    }
})();
4

6 回答 6

5

这两个片段都是等价的,因为它们都是在您正在创建的匿名函数的(相同)环境中定义的。我认为您可以localStatefoo任何一种方式访问​​。

话虽如此...如果您正在创建的环境中有大量变量,那么foo的执行时间可能会受到影响,因为变量查找可能需要更长的时间。如果您在定义的函数中不再使用大量变量foo,并且foo也不需要它们,那么foo将导致它们不被垃圾收集,因此这也可能是一个问题。

于 2008-10-28T16:23:27.483 回答
5

狗,我希望声明的顺序是 JavaScript 解释器抽象出来的东西。在任何情况下,如果存在性能差异,那么它就会成为过早优化弊端的典型代表。

于 2008-10-28T20:46:53.210 回答
3

Javascript 中的每个函数都是一个闭包。仅当函数引用该变量时,才会产生解析变量值的运行时。例如,在这个例子中,即使 x 没有被 y 直接引用,函数 y 也会捕获 x 的值:

var x = 3;
function y() eval("x");
y();
3
于 2008-10-29T14:12:34.423 回答
2

我认为不会有任何性能开销,因为 java 脚本不使用函数堆栈的概念。它支持词法作用域。在闭包调用中执行相同的状态。附带说明一下,在您的示例中,您似乎没有执行任何语句!

于 2008-10-28T16:22:35.583 回答
1

var 或 function 声明的范围是它出现的整个块,无论声明在块中的哪个位置;所以它会影响效率是令人惊讶的。

也就是说,“function foo()”在此块中是在“var localState”之前还是之后都无关紧要。“function foo()”是在这个块中还是在一个封闭的块中可能很重要(如果它可以提升到更高的范围,因为它不使用任何局部变量);这取决于您的 Javascript 编译器的详细信息。

于 2008-10-28T16:22:15.740 回答
0

在您的示例中,差异并不重要。即使 foo 在全局范围内,您也不会有问题。

但是,请记住,如果您使用将函数分配给变量的方式来声明您的函数,那么它们的声明顺序可能会成为一个很大的问题。

为了更好地了解,请尝试以下两个示例:

CheckOne();
function CheckOne() {
    alert('check...check one.');
}

CheckTwo();
var CheckTwo = function() {
    alert('check...check two.');
};

第二个和第一个之间的唯一区别是它们用于声明其函数的样式。第二个生成参考错误。

干杯。

于 2009-08-14T14:44:13.413 回答