var
的哪种用法是正确的:
$( 'li' ).each( function()
{
var item = $( this );
// ...
});
或
var item;
$( 'li').each( function()
{
item = $( this );
// ...
});
两者都工作正常,即使有'use strict'
。这两者之间有什么根本区别吗?
谢谢。
答案 0 :(得分:2)
这取决于你想要的结果。在第一种情况下,变量在函数中声明,这意味着它对每个迭代/函数调用都是唯一的,并且在循环/函数之外是不可访问的。
第二种情况允许您访问函数/循环外部的变量,它将包含最后一次迭代的值。
答案 1 :(得分:0)
从长远来看,这样的优化可能并不重要。
请查看以下JSPerf:
http://jsperf.com/declaring-variables-inside-loops/4 http://jsperf.com/declaring-variables-inside-loops/11
似乎仍有争议:P
答案 2 :(得分:0)
如果是"正常循环" (即。for
)那么你的第一个代码块在技术上是不正确的(至少从人类可读性,最不惊讶的角度来看)。
但是因为你有一个带回调的jQuery迭代函数, 实际上是一个区别。不同之处在于,item
的最后一个值可以在第二个代码块的循环外部访问,但在第一个块中它将保留在闭包内。
答案 3 :(得分:0)
有。
因为JavaScript变量是函数范围的,所以在第一种情况下,变量将仅存在于迭代器中声明的匿名函数内,并且每次运行时都会分配变量,每次它都是一个新变量。
在第二种情况下,函数被限制在某个外部范围内,并且在每次迭代时它将是完全相同的变量,保留值,存储在先前的执行中
单词"在每次迭代时分配"可能听起来很可怕,但基本上它不是问题,像V8这样的JS引擎可以很容易地执行优化,这会将开销减少到0.我说它是推荐变量的推荐方法 - 绑定它们到最合理的范围。
说到第二种情况 - 因为没有东西会被破坏,所以它通常是一种糟糕的设计实践,因为一些垃圾旧存储的值可能会泄漏到其他一些上下文,变量可能会被延续时的某些意外关闭所捕获,等。使用局部变量作为本地变量。