我昨天看了http://www.youtube.com/watch?v=mHtdZgou0qU,我一直在考虑如何改进我的javascript。当我重新编写一个在firefox中看起来非常不稳定的动画时,我正试图记住他所说的一切。
我想知道的一件事是for
循环是否会添加到范围链中。 Zakas谈了很多关于闭包如何添加到作用域链,并且访问局部作用域之外的变量往往需要更长时间。使用for
循环,因为您可以在第一个语句中声明变量,这是否意味着它正在向链中添加另一个范围?我不会假设,因为Zakas也说do-while
,while
和for
循环之间没有区别,但它似乎仍然如此。
我问的部分原因是因为我经常在JS库中看到代码如:
function foo(){
var x=window.bar,
i=0,
len=x.length;
for(;i<len;i++){
//
}
}
如果for
循环确实在链中添加了另一个对象,那么这将是非常低效的代码,因为循环内的所有操作(假设它们使用i
)将访问一个out-of -scope变量。
同样,如果我被要求下注,我会说他们没有,但为什么不能在循环之外访问所使用的变量?
答案 0 :(得分:5)
JavaScript没有块范围,并且它具有变量提升,因此任何看似在for
循环中定义的变量实际上并未在那里定义。
您看到示例中提供的代码的原因是因为提升行为。代码的作者知道变量提升,因此在开始时声明了范围的所有变量,因此很清楚JavaScript正在做什么。