for循环是否在Javascript中将另一个对象添加到作用域链中?

时间:2012-03-20 21:33:07

标签: javascript

我昨天看了http://www.youtube.com/watch?v=mHtdZgou0qU,我一直在考虑如何改进我的javascript。当我重新编写一个在firefox中看起来非常不稳定的动画时,我正试图记住他所说的一切。

我想知道的一件事是for循环是否会添加到范围链中。 Zakas谈了很多关于闭包如何添加到作用域链,并且访问局部作用域之外的变量往往需要更长时间。使用for循环,因为您可以在第一个语句中声明变量,这是否意味着它正在向链中添加另一个范围?我不会假设,因为Zakas也说do-whilewhilefor循环之间没有区别,但它似乎仍然如此。

我问的部分原因是因为我经常在JS库中看到代码如:

function foo(){
    var x=window.bar,
        i=0,
        len=x.length;
    for(;i<len;i++){
        //
    }
} 

如果for循环确实在链中添加了另一个对象,那么这将是非常低效的代码,因为循环内的所有操作(假设它们使用i)将访问一个out-of -scope变量。

同样,如果我被要求下注,我会说他们没有,但为什么不能在循环之外访问所使用的变量?

1 个答案:

答案 0 :(得分:5)

JavaScript没有块范围,并且它具有变量提升,因此任何看似在for循环中定义的变量实际上并未在那里定义。

您看到示例中提供的代码的原因是因为提升行为。代码的作者知道变量提升,因此在开始时声明了范围的所有变量,因此很清楚JavaScript正在做什么。