执行for循环将另一个对象添加到Javascript中的作用域链中

Does a for loop add another object to the scope chain in Javascript?

本文关键字:Javascript 作用域 添加 循环 for 一个对象 执行      更新时间:2023-09-26

我看了这个:http://www.youtube.com/watch?v=mHtdZgou0qU昨天,我一直在思考如何改进我的javascript。在重写一部在萤火虫中看起来波涛汹涌的动画时,我尽量把他说的每一句话都记在心里。

我想知道的一件事是for循环是否会添加到作用域链中。Zakas谈到了闭包是如何添加到作用域链中的,并且访问本地作用域之外的变量往往需要更长的时间。对于for循环,由于您可以在第一条语句中声明一个变量,这是否意味着它正在向链中添加另一个作用域?我认为不会,因为Zakas也说过do-whilewhilefor循环之间没有区别,但看起来仍然是这样。

我问这个问题的部分原因是,在JS库中,我经常看到这样的代码:

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

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

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

JavaScript没有块作用域,并且具有变量提升,因此任何看起来在for循环中定义的变量实际上都没有在那里定义。

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