首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在for-循环中让var:作用域

在for-循环中让var:作用域
EN

Stack Overflow用户
提问于 2016-08-06 06:28:18
回答 2查看 1.5K关注 0票数 3

有谁能解释一下( var和let之间的行为差异)?

  1. 经典面试问题(闭幕词): 设a= [];for (var i=0;i<10;i++) { ai = function() { console.log(i,);} a0;// 10 a1;// 10
  2. 如果我们使用let: 设a= [];for (设i=0;i<10;i++) { // var => let ai = function() { console.log(i);} a0;// 1 a1;// 2

是的,当我使用'let‘的时候,我是正常的,和预期的一样。我的第一个想法是,让我们不支持结束。但不,它支持。(在Chrome上测试过):

代码语言:javascript
复制
function bb() {
  let b = 1;
  return function() {
    console.log(b);
  }
}
bb()();    // 1, means a closure is created

然后我的第二个解释是:当使用let in for循环时。对于每个循环,它反复创建一个新的I。我在铬调试器中证明了这一点。

问题是:

如果我是在for-循环的每个循环中创建的。它是如何持续增长的?如果每次创建它,为什么不像我们声明的那样保持为0呢?

代码语言:javascript
复制
for (let i=0; .......)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-06 10:36:25

从您的示例中,每次迭代都要创建“词法声明”let i的环境。但是,for循环使用以前的环境来创建下一个环境。因此,当增量发生时,它从停止的地方开始。否则,使用let声明i将创建一个无限循环(即,i总是<10)。

它的工作原理:

在for循环身体评价中,在“test”和“CreatePerIterationEnvironment(perIterationBindings)”之后的步骤是CreatePerIterationEnvironment(perIterationBindings),它声明一个新的环境,并将所有绑定初始化为最后一个已知值:thisIterationEnv.InitializeBinding(bn, lastValue)。完成后,新环境被设置为当前环境,“增量”步骤开始。

定义:

InitializeBinding(N,V)设置环境记录中已经存在但未初始化的绑定的值。字符串值N是绑定名称的文本。V是绑定的值,是任何ECMAScript语言类型的值。

票数 6
EN

Stack Overflow用户

发布于 2016-08-06 06:58:34

第一,错误(意外)的结果仅仅是因为闭包可以访问外部函数变量的更新值(最后,闭包中的变量'i‘是10);

第二种方法是使用let声明变量i,将其标记为block variable,这意味着闭包将立即获得i(就像IIFE一样)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38801257

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档