背景
最近在总结基础知识,然后看了阮一峰老师的es6教程,其中谈及let
以及块级作用域
的时候,举了一个经典的例子,代码如下:
var a = [];for (var i = 0; i < 10; i++) { // 作用域a a[i] = function () { // 作用域b console.log(i); }; } a[6](); // 10
因为es5
不存在块级作用域,所以迭代变量i
泄露了,然后对于a数组
内每一个函数内的i
都是向上查询作用域a
的,所以结果是10
。这个没问题。
下面的例子是用let来声明迭代变量的
var a = [];for (let i = 0; i < 10; i++) { a[i] = function () { console.log(i); }; } a[6](); // 6
老师是这样解释的
上面代码中,变量i是let声明的,当前的i只在本轮循环有效,所以每一次循环的i其实都是一个新的变量,所以最后输出的是6。
疑问
我想不通每一次循环的i其实都是一个新的变量
这个过程是怎么样的,如果我理解为每次迭代都是新的一个块级作用域,那么迭代变量的迭代(i++
)是如何传递给下一个块级作用域呢?
自知之明
虽然我知道结果,也知道这样的问题是转牛角尖,就是好奇问问。希望各路英雄指点迷津。
慕妹3242003
相关分类