有谁能解释一下( var和let之间的行为差异)?
是的,当我使用'let‘的时候,我是正常的,和预期的一样。我的第一个想法是,让我们不支持结束。但不,它支持。(在Chrome上测试过):
function bb() {
let b = 1;
return function() {
console.log(b);
}
}
bb()(); // 1, means a closure is created然后我的第二个解释是:当使用let in for循环时。对于每个循环,它反复创建一个新的I。我在铬调试器中证明了这一点。
问题是:
如果我是在for-循环的每个循环中创建的。它是如何持续增长的?如果每次创建它,为什么不像我们声明的那样保持为0呢?
for (let i=0; .......)发布于 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语言类型的值。
发布于 2016-08-06 06:58:34
第一,错误(意外)的结果仅仅是因为闭包可以访问外部函数变量的更新值(最后,闭包中的变量'i‘是10);
第二种方法是使用let声明变量i,将其标记为block variable,这意味着闭包将立即获得i(就像IIFE一样)。
https://stackoverflow.com/questions/38801257
复制相似问题