javascript闭包和函数放置
函数的放置是否会影响范围内闭包的性能?如果是的话,将这些功能放在哪里最合适?如果不是,闭包所隐含的关联是否足以合理地将函数放置在另一个位置 例如,如果foo不依赖于localState的值,那么可以从foo访问localState这一事实是否对foo的执行时间、内存使用等有影响javascript闭包和函数放置,javascript,performance,coding-style,structure,closures,Javascript,Performance,Coding Style,Structure,Closures,函数的放置是否会影响范围内闭包的性能?如果是的话,将这些功能放在哪里最合适?如果不是,闭包所隐含的关联是否足以合理地将函数放置在另一个位置 例如,如果foo不依赖于localState的值,那么可以从foo访问localState这一事实是否对foo的执行时间、内存使用等有影响 (function(){ var localState; function foo(){ // code } function bar(){ // co
(function(){
var localState;
function foo(){
// code
}
function bar(){
// code
return localState;
}
})();
换句话说,这是一个更好的选择吗?如果是,为什么
(function(){
function foo(){
// code
}
var localState;
function bar(){
// code
return localState;
}
})();
已表明上述两个示例是相同的,因为可以从块内的任何位置访问localState。但是,下面的示例(其中foo在块外部定义)可能是不同的情况。你觉得怎么样
function foo(){
// code
}
(function(){
var localState;
function bar(){
// code
foo();
return localState;
}
})();
var或函数声明的范围是它出现在其中的整个块,而不管声明在块中的什么位置;因此,它会影响效率,这是令人惊讶的
也就是说,在这个块中,“function foo()”是在“var localState”之前还是之后并不重要。“function foo()”是在这个块中还是在一个封闭的块中可能很重要(如果它可以提升到更高的范围,因为它不使用任何局部变量);这取决于Javascript编译器的细节。我认为不会有任何性能开销,因为java脚本没有使用函数堆栈的概念。它支持词法范围。在闭包调用中执行相同的状态。另一方面,在您的示例中,您似乎没有执行任何语句 这两个代码段是等效的,因为它们都是在您正在创建的匿名函数的(相同)环境中定义的。我想您可以从
foo
中访问localState
话虽如此。。。如果您正在创建的环境中有大量的变量,那么
foo
的执行时间可能会受到影响,因为变量查找可能需要更长的时间。如果您在中定义的函数中不再使用大量变量,foo
,并且foo
也不需要它们,那么foo
将导致它们不能被垃圾收集,因此这也可能是一个问题。var x = 3;
function y() eval("x");
y();
3
在你的例子中,差异其实并不重要。即使foo在全局范围内,您也不会有问题 但是,要记住,如果使用将函数赋值给变量的方式来声明函数,那么它们的声明顺序可能会成为一个相当大的问题 要获得更好的想法,请尝试以下两个示例:
CheckOne();
function CheckOne() {
alert('check...check one.');
}
CheckTwo();
var CheckTwo = function() {
alert('check...check two.');
};
第二个和第一个的唯一区别是它们用于声明函数的样式。第二个生成一个引用错误
干杯。你说得对!我试图用“//code”注释暗示一些执行,但显然不是很清楚。谢谢你的回答。事实上,要看到JS确实关闭了未使用的变量,请尝试以下方法:(function(){var a=1;return function(x){eval(x)}()(“alert(a)”)显然,内部函数没有引用
a
,但它是可用的。相反,在Perl中,sub{my$a=1;sub eval$[0]}->('print$a'),不打印任何内容,但sub{my$a=1;sub{$a;eval${[0]}->('$a')确实:Perl关心变量是否被引用以确定它是否被关闭。其次,让我们不要找到更多的方法来创建不可读的代码。请注意,Andrew。即使有一些假设的性能提升,我也希望看到它以最干净、最合乎逻辑的顺序编写。