|      1swirling      2016-09-23 13:36:31 +08:00 var i = 0;  for(; i<3; i ++){ funcList.push(function(){ console.log(i); }) } 这样不就好理解了吗。。。 | 
|  |      2viko16      2016-09-23 13:40:51 +08:00 执行函数的时候才去读 i 的值 | 
|  |      3learnshare      2016-09-23 13:46:12 +08:00 经典坑 Number 0 | 
|  |      4hronro      2016-09-23 13:47:55 +08:00 via Android for 小括号里面第一个语句,定义的变量 i ,是全局变量 i ,没什么不好理解的吧 | 
|  |      5lovedebug      2016-09-23 13:51:12 +08:00 JS 在 ES6 之前 for 循环没有块作用域 | 
|  |      6loushizan      2016-09-23 13:52:09 +08:00 var funcs = []; for (var i = 0; i < 3; i++) { (function(i) { funcs.push(function() { console.log(i); }); })(i); }; | 
|      7kimown      2016-09-23 13:54:28 +08:00 论 ES6 的巨大进步 | 
|      8Skyxianbo      2016-09-23 13:55:40 +08:00 没什么不好理解的, var 定义的 i 是全局的,等你在第二个循环里面调用的时候才去读 i 的值,这个时候的 i 已经经过第一个循环然后变成 3 了。你把 var 换成 let ,这样定义的 i 只在第一个循环里面起效果,就不会出现这样的问题了。可以去看看 ES6 的块级作用域。 | 
|  |      9aristotll      2016-09-23 13:56:05 +08:00 用 let... | 
|      10think2011      2016-09-23 14:05:00 +08:00 let let let | 
|  |      11wallax      2016-09-23 14:09:39 +08:00 不用 let 也能解决  只要控制好作用域就行了 var funclist = []; var func = function(a){ funclist.push(function(){console.log(a)}); }; for(var i = 0; i < 3; i++){ func(i); } for(var j = 0; j < 3; j++){ funclist[j](); } | 
|  |      12iyangyuan      2016-09-23 14:10:15 +08:00 入门问题 | 
|      13SuperMild      2016-09-23 14:22:30 +08:00 via iPad 如非必要就别用旧标准了, let 已经得到广泛支持。 | 
|  |      14js0816      2016-09-23 14:22:54 +08:00 let 替换 var 就 O 了 | 
|      15prefere      2016-09-23 14:51:52 +08:00 问个小白问题,这个菊部变量 i 存哪了? http://imgur.com/KV5NjMA.jpg | 
|      16prefere      2016-09-23 14:52:46 +08:00  1 更正: 菊>局 | 
|      17prefere      2016-09-23 14:54:44 +08:00 | 
|  |      18zhouyg      2016-09-23 16:07:18 +08:00 一点开我就猜是这个问题,😄太经典。 | 
|      19defia      2016-09-23 17:10:13 +08:00 via iPhone 闭包内保留的是变量引用 | 
|  |      20cheneydog      2016-09-23 17:13:06 +08:00 典型的闭包问题 | 
|  |      21FrankFang128      2016-09-23 17:22:06 +08:00 搞不懂 var ,最后去用 let 。 呵呵。 | 
|      22wangcansun      2016-09-23 17:22:27 +08:00 所以 es6 中使用 let 了 | 
|  |      23ianva      2016-09-23 17:30:39 +08:00 ES6 的实现: [1,2,3].map( num=>()=>console.log(num) ).forEach(fn=>fn()) 在大部分的情况下 map, filter, reduce, forEach 代替 for 要简单的多 | 
|  |      24ianva      2016-09-23 17:40:43 +08:00 再彻底一点: [...Array(3).keys()].map( num=>()=>console.log(num) ).forEach(fn=>fn()) | 
|  |      2521grams      2016-09-23 17:50:12 +08:00 别再用 var 了,全部用 let | 
|  |      27fundon      2016-09-23 18:27:27 +08:00 安利下 「 ES6: 快速体验,及实用小贴士」 https://github.com/fundon/ES6-QuickStart-and-Tips | 
|  |      28vwok      2016-09-23 18:35:08 +08:00  1 @prefere    看的讲闭包的都没讲到原型结构啊,今天终于知道 closure 是怎么来的了 | 
|      29sudoz      2016-09-23 18:36:39 +08:00 入队的时候没有执行 console.log 啊 | 
|  |      30hronro      2016-09-23 18:40:35 +08:00 via Android 楼上的各位说用 let 的,现在没人敢直接在生产环境下直接用 let 吧?都是要 babel 编译之后才能用的。如果只是一个小程序的话,上 babel 的成本又太高了 | 
|  |      31yhxx      2016-09-23 22:56:08 +08:00 因为 let 提供了块级作用域 | 
|  |      32magicdawn      2016-09-24 02:12:29 +08:00 1. 闭包不是 js 专利, 在 gopl 上看到 golang 也有这个问题 2. 使用 let 解决的解释 - https://cnodejs.org/topic/56c7d5cf5a619f490208f9cc - https://cnodejs.org/topic/56c7d5cf5a619f490208f9cc#56c9a25d92cca07861f942d0 - http://dmitrysoshnikov.com/ecmascript/javascript-the-core/comment-page-3/#comment-173985 | 
|      34YuJianrong      2016-09-24 08:30:31 +08:00 via iPhone @hronro 成本高在哪?编译出来大小增加不大啊。 如果用到一些增强的内置函数需要挂 polyfill ,但这个可以自己挑需要什么啊,即使全部挂上也没多大。 | 
|  |      35Bensendbs      2016-09-24 10:03:23 +08:00 用 let...var 有作用域提升的问题.. | 
|  |      36winiex      2016-09-24 10:31:13 +08:00 let 的作用于是我们常见意义上的块级作用于,而 var 的作用域则仅适用于 function ,一般意义上的 code block 对它没有作用域的限制意义。从编程语言的角度来看, var 声明的变量的作用域部分是不完整的。建议用 let 。 [“ let ” keyword vs “ var ” keyword in Javascript]( http://stackoverflow.com/questions/762011/let-keyword-vs-var-keyword-in-javascript) | 
|  |      37zongren      2016-09-24 10:34:23 +08:00 用闭包也能解决吧 | 
|  |      38wizardforcel      2016-09-24 11:16:58 +08:00 @prefere 每个函数在调用时都会有一个帧,局部变量当然是存到帧里面。但是有的帧在函数返回时会销毁, lz 这种情况不会。因为函数中的函数会关联外层函数的帧,这个帧还有函数在用就没法销毁。 | 
|      39poke707      2016-09-24 16:30:22 +08:00 这个可以说是 Javascript 的坑也可以说是 feature 。虽然有意这样写的情况不多见吧。 重要的是要理解编程语言本身,变量的值和引用啊,作用域啊,语法和表达式啊。 如果不重视基本功, ES6 照样会踩坑。 比如 [1,2,3].map(n => {value: n}) 有人觉得会返回他以为的东西,有人觉得会报错(比如我,我都忘了有 label 这回事)。 但结果是不但不报错还会返回 [undefined, undefined, undefined] 呢。 | 
|  |      40neone      2016-09-24 18:58:10 +08:00 JS 的经典问题。 `var` 声明是没有块级作用域的,所以上面的代码等于: ``` var i; for (i = 0; i < 3; i++) { funcList.push(function() { console.log(i); }); } ``` ES5 中可以使用闭包解决, ES6 中直接使用`let`即可。 `let`声明的变量具有块级作用域,所以 3 次循环会产生 3 个不相同(仅同名)的变量`i`,添加入数组中的函数引用的是不同的变量。事实上你在循环的外部先用`let`定义变量`i`,那么结果也都是 3 3 3 ,如下: ``` let funcList = []; let i; for (i = 0; i < 3; i++) { funcList.push(() => { console.log(i); }); } for (let j = 0; j < 3; j++) { funcList[j](); } ``` | 
|  |      41itisthecon      2016-09-24 20:40:01 +08:00 想通了这个基本就能填上变量申明提升的坑了 > var myvar = 'global value'; > (function() {console.log(myvar);var myvar='local value';})(); undefined |