1
dorentus 2013-08-13 19:09:58 +08:00 2
for (var i = 1; i <= 5; i++) 这里的 i 是全局可见的,于是循环体里的函数每次被调用的时候都是取的这个全局的 i 的值,而循环结束后,i 的值就被固定为 5 了。
循环体里面的 let j = i; 限制了变量 j 的作用域在循环体内,每次循环的时候这个 j 都是新的(被赋予了当时变量 i 的值),同在循环体里的函数所使用的 j 都是当次循环时创建的 j(好像正常的说法是说『j 和这个函数被绑定在了一起,形成了一个闭包』这样吧)。 ev 就是 event 的缩写吧。el 大概是 element。 说句题外话,Javascript 这个名字好像是 Mozilla 基金会所有的,MDN 里面提到的 Javascript x.x 就是特指他们自己的这个实现的版本。 |
2
bitsmix 2013-08-13 23:13:17 +08:00
觉得这不是啥好事儿额。。
又多了一个坑 |
3
chemzqm 2013-08-13 23:32:54 +08:00
如果你在一个函数里var多次j,它其实都是指向一个引用。
|
4
Windweller OP @chemzqm 这个例子。。MDN的这个例子是不是比较极端,本来不该把item.onclick的事件注册放到循环中去的。它为了表明let j每次都是新的,才故意放到循环里去了。。
其实我把这段代码复制到JS Bin去后发现是报错的jsbin.com/ 说是不要在循环里放置函数,而且也说expect an identifier instead saw "let"。。Chrome Console里好像也不认识let。。。 |
5
toctan 2013-08-14 00:32:19 +08:00 2
@Windweller 不是不该把 item.onclick 的事件注册放到循环中去,而是不应该在循环中制造 closures
参见 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Closures Creating closures in loops: A common mistake 一节 https://gist.github.com/toctan/6222729 |
7
Windweller OP @toctan 原来let只能在Firefox上用,怪不得Chrome里调试会失败了!在MDN上看到JS1.7,JS1.85一类的特殊申明,都是只能在Firefox上用,其他浏览器不能使用吗?(这简直是极大增加学习难度嘛)
|
9
zzNucker 2013-08-14 12:15:20 +08:00
@Windweller 可以认为Javascript 是mozilla的标准
其它浏览器支不支持要看能不能普及咯 比如能不能进入ECMA的标准 |
10
SuperMonster009 2019-04-19 08:13:28 +08:00 via Android
还是多用 let 和 const 吧 var 感觉会被慢慢遗弃的 总有一天编辑器会提示你 var is depricated
|