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

例如,如果 foo 不依赖于 localState 的值,那么可以从 foo访问 localState 这一事实 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;
    }
})();
有帮助吗?

解决方案

Javascript中的每个函数都是一个闭包。只有在函数引用变量时,才会产生解析变量值的运行时。例如,在此示例中,函数y捕获x的值,即使x未直接由y引用:

var x = 3;
function y() eval("x");
y();
3

其他提示

这两个片段都是等效的,因为它们都是在您正在创建的匿名函数的(相同)环境中定义的。我想你无论如何都可以从 foo 访问 localState

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

狗,我希望声明的顺序将是JavaScript解释器抽象出来的东西。在任何情况下,如果存在性能差异,那么将其作为过早优化的祸害的海报就是最小的。

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

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

也就是说,“function foo()”是否应该无关紧要。在“var localState”之前或之后在这个街区内。无论是“函数foo()”还是可能是在这个块中还是在一个封闭的块中(如果它可以被提升到更高的范围,因为它不使用任何局部变量);这取决于你的Javascript编译器的细节。

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

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

为了更好的想法,请尝试以下两个示例:

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

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

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

干杯。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top