Javascript 在循环中声明相同的变量名

Javascript 在循环中声明相同的变量名,javascript,loops,variables,Javascript,Loops,Variables,var的哪个用法正确: $( 'li' ).each( function() { var item = $( this ); // ... }); 或 这两种方法都可以很好地工作,即使有“使用严格的”。这两者之间有什么根本区别吗 谢谢。从长远来看,像这样的优化可能并不重要 请在下面签出JSPerf: 似乎仍有争论在进行:这取决于你想要的结果。在第一种情况下,变量在函数内部声明,这意味着它对于每次迭代/函数调用都是唯一的,并且在循环/函数外部不可访问 第二种情况允许您访问函

var
的哪个用法正确:

$( 'li' ).each( function()
{
    var item = $( this );

    // ...
});

这两种方法都可以很好地工作,即使有
“使用严格的”
。这两者之间有什么根本区别吗


谢谢。

从长远来看,像这样的优化可能并不重要

请在下面签出JSPerf:


似乎仍有争论在进行:这取决于你想要的结果。在第一种情况下,变量在函数内部声明,这意味着它对于每次迭代/函数调用都是唯一的,并且在循环/函数外部不可访问

第二种情况允许您访问函数/循环外部的变量,其中将包含上一次迭代的值。

如果它是“正常循环”(即
for
),那么您的第一个代码块在技术上是不正确的(至少从人类可读性的角度来看,至少从出人意料的角度来看)

但是因为您有一个带有回调的jQuery迭代函数,所以实际上有一个区别。不同之处在于,
项的最后一个值将在第二个代码块的循环外可访问,但在第一个代码块中,它将保留在闭包内。

因为在JavaScript中变量是函数作用域,所以在第一种情况下,变量将只存在于匿名函数中,在迭代器中声明,并将在每次运行时分配,每次它都将是一个新变量

在第二种情况下,函数被限定在某个外部范围内,并且在每次迭代中它将是完全相同的变量,保留在前一次执行中存储的值

“在每次迭代中分配”这个词听起来很可怕,但基本上这不是问题,像V8这样的JS引擎可以轻松地执行优化,这将把开销减少到0。我认为这是一种推荐的声明变量的方法——将变量绑定到最合理的范围内


说到第二种情况——由于没有任何东西会被破坏,这通常是一种糟糕的设计实践,因为一些垃圾旧存储值可能会泄漏到其他上下文,变量可能会在继续时被一些意外的闭包捕获,等等。。使用局部变量作为真正的局部变量。

这两种方法都是正确的,第二种方法
项可以在循环外部访问(这就是区别)@raina77ow:不,它不是
循环的
,而是
每个
都有回调。
var item;

$( 'li').each( function()
{
    item = $( this );

    // ...
});