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

时间:2014-07-08 12:38:38

标签: javascript loops variables

var的哪种用法是正确的:

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

    // ...
});

var item;

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

    // ...
});

两者都工作正常,即使有'use strict'。这两者之间有什么根本区别吗?

谢谢。

4 个答案:

答案 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.我说它是推荐变量的推荐方法 - 绑定它们到最合理的范围。

说到第二种情况 - 因为没有东西会被破坏,所以它通常是一种糟糕的设计实践,因为一些垃圾旧存储的值可能会泄漏到其他一些上下文,变量可能会被延续时的某些意外关闭所捕获,等。使用局部变量作为本地变量。