javascript闭包和功能放置

时间:2008-10-28 16:12:36

标签: javascript performance coding-style structure closures

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

例如,如果 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已建议below上述两个示例相同,因为 localState 可以在块内的任何位置访问。但是,在块外部定义 foo 的示例可能是不同的情况。你觉得怎么样?

function foo(){
    // code
}

(function(){

    var localState;

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

6 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:5)

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

答案 2 :(得分:3)

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

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

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

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

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

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

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

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

干杯。