Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 闭包中变量的性能与作为函数参数的性能_Javascript_Scope - Fatal编程技术网

Javascript 闭包中变量的性能与作为函数参数的性能

Javascript 闭包中变量的性能与作为函数参数的性能,javascript,scope,Javascript,Scope,有人知道通过函数参数传递变量与通过闭包提供变量的优化效果吗?似乎通过函数参数传入变量会更快,因为对象是通过引用复制的(所以复制时间很快),并且爬升函数的作用域环境需要在每个级别检查环境。这是我的意思的要点 a = 5; b = function() { alert(a); } b(); 对 a = 5; b = function(c) { alert(c); } b(a); 从理论上讲,哪一种性能更快?这要看情况而定。不要担心,除非这是将来的大问题。我刚才也有同样的问题,所以我凑了个

有人知道通过函数参数传递变量与通过闭包提供变量的优化效果吗?似乎通过函数参数传入变量会更快,因为对象是通过引用复制的(所以复制时间很快),并且爬升函数的作用域环境需要在每个级别检查环境。这是我的意思的要点

a = 5;
b = function() {
  alert(a);
}
b();

a = 5;
b = function(c) {
  alert(c);
}
b(a);

从理论上讲,哪一种性能更快?

这要看情况而定。不要担心,除非这是将来的大问题。

我刚才也有同样的问题,所以我凑了个热闹。大多数流行浏览器(令人惊讶地)似乎更喜欢在范围内查找(FF24非常喜欢)

我希望这能回答你的问题

爬升功能的范围环境需要检查每个级别的环境

只是理论上。事实上,由于范围链不是动态的,因此可以并且将优化为静态引用

通过函数参数传入变量会更快,因为对象是通过引用复制的(所以复制时间很快)

即使速度很快,它们仍然需要被复制。函数需要为它们分配额外的内存,而对闭包的引用不是这样的



如果您可以在闭包范围中放入一个值,那么就这样做。它只是实用的,你想要建立一个闭包。如果函数中不需要变量参数,请使用参数。使用可读性更强的选项。

比什么更快?根据什么标准?ECMA-262没有定义实现,因此理论上两者都不是更快的。标识符必须在作用域链上解析,而不管它们属于哪个执行上下文,因此理论上局部变量的解析速度应该更快。但与直觉相反的是,我们知道在某些环境中全局搜索速度更快。所以“测试会告诉”和“在不同的浏览器中期望不同的结果”是适用的。但是它们是不能互换的…第一个函数依赖于
a
,而第二个函数不依赖于,因此,您可以在不同的情况下使用它们。@elclanrs-我理解的问题是,解析局部变量还是解析作用域链(通过闭包建立)上的变量更快。测试似乎表明,速度因浏览器而异。不过,对于js垃圾收集器,我更感兴趣的是内存使用的差异,以及最终的浏览器性能。我有一个稍微相关的问题:你能解释一下使用闭包相对于函数参数有什么好处吗?区别似乎不大,但这种引用仍然很好(至少表明它没有太大区别)。对我来说,在i686上使用Opera12.16时,使用“passed”会稍微快一点。jsPerf已经停止了一段时间。有没有可能,你能提供代码?