函数的放置是否会影响范围内闭包的性能?如果是这样,那么放置这些功能的最佳位置在哪里?如果不是,关闭的隐含关联是否有足够的理由将逻辑上的函数放在另一个地方?
例如,如果 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;
}
})();
答案 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.');
};
第二个和第一个之间的唯一区别是它们用于声明其功能的样式。第二个产生参考错误。
干杯。