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