浅析JavaScript作用域链、执行上下文与闭包(2)

了解了作用域链和执行上下文,回过头看篇首的那段代码,基本上就可以解释闭包式如何工作了。函数调用的时候创建的执行上下文以及词法作用域链保持函数调用所需要的信息, f 函数调用之后才可以返回local scope。

需要注意的是,函数内定义的多个函数使用的是同一个作用域链,在使用 for 循环赋值匿名函数对象的场景比较容易引起错误,举例如下:

var arr = []; for (var i = 0; i < 10; i++) { arr[i] = { func: function() { return i; } }; } arr[0].func(); // 返回 10,而不是 0

arr[0].func()返回的是 10 而不是 0,跟感官上的语义有偏差。在 ECMAScript 6 引入 let 之前, 变量作用域范围是在整个函数体内而不是在代码区块之内,所以上面的例子中所有定义的 func 函数引用了同一个作用域链在 for 循环之后, i 的值已经变为 10 。

正确的做法是这样:

var arr = []; for (var i = 0; i < 10; i++) { arr[i] = { func: getFunc(i) }; } function getFunc(i) { return function() { return i; } } arr[0].func(); // 返回 0

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wgwwjw.html