vlxer 最近的时间轴更新
vlxer

vlxer

V2EX 第 200904 号会员,加入于 2016-11-11 17:30:42 +08:00
vlxer 最近回复了
可以去,但只能去一次
2016-11-16 14:54:20 +08:00
回复了 brooky 创建的主题 JavaScript var 和 let 的区别?
要理解这个,首先要理解词法作用域。

* 定义一个函数的时候,函数会保存当前作用域
* 函数执行的时候,会创建一个新的作用域,用于存放函数参数和局部变量,同时新的作用域指向函数保存的作用域,构成作用域链

因此,第一个例子中,由于没有块级作用域,循环里的所有函数都是共享同一个作用域的, a[0] == a[1] == ... == a[9] == i == 10 。

第二个例子中,有块级作用域,等价于:

```js
var a = [];
for (var i = 0; i < 10; i++) {
(function(i) {
a[i] = function() {
console.log(i);
};
})(i);
}
a[6](); // 6
```

通过查看 babel 的转换也可以看出:
http://babeljs.io/repl/#?babili=false&evaluate=true&lineWrap=false&presets=latest%2Creact%2Cstage-2&experimental=false&loose=false&spec=false&code=var%20a%20%3D%20%5B%5D%3B%0Afor%20(let%20i%20%3D%200%3B%20i%20%3C%2010%3B%20i%2B%2B)%20%7B%0A%20%20a%5Bi%5D%20%3D%20function%20()%20%7B%0A%20%20%20%20console.log(i)%3B%0A%20%20%7D%3B%0A%7D%0Aa%5B6%5D()%3B%20%2F%2F%206&playground=true

不明白问我,付费指导。
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   4884 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 13ms · UTC 01:08 · PVG 09:08 · LAX 18:08 · JFK 21:08
Developed with CodeLauncher
♥ Do have faith in what you're doing.