
1 wwqgtxx 2017-08-27 10:55:04 +08:00 因为闭包 |
2 ClassicOldSong 2017-08-27 10:55:49 +08:00 via Android 典型的闭包问题 |
3 we2ex 2017-08-27 11:26:55 +08:00 从 ES6 就不建议用 var 了,用 let 吧 |
5 addywu 2017-08-27 11:31:56 +08:00 via Android var 作用域 |
6 klesh 2017-08-27 11:32:18 +08:00 via Android a[i] = (function (ii){ return function (){ document.get... = ii; }; })(i); |
7 Parabolazz 2017-08-27 11:36:04 +08:00 搜索一下 js 闭包 |
8 crystom 2017-08-27 11:38:41 +08:00 相当于 var i 是在外面定义的 |
10 asdf123101 2017-08-27 11:54:21 +08:00 via Android 楼上都说完了不知道该说什么。典型闭包的问题,MDN 上 let 词条里面有例子和解释。 |
11 xrr2016 2017-08-27 12:10:10 +08:00 因为运行 `a[6]()` 的时候变量 i 是 10 |
12 qq12345454 2017-08-27 12:24:51 +08:00 用 let 或者 const |
13 deepkolos 2017-08-27 12:59:34 +08:00 for 循环结束之后 i 的值为 10 |
14 autoxbc 2017-08-27 14:02:29 +08:00 via iPhone 这是求值时机问题,是无形参函数从作用域链检索变量问题 直接说闭包问题,显然是给出了解决方法,却回避了问题自身 |
15 siteshen 2017-08-27 14:24:23 +08:00 我就想歪楼问下为啥发在 python 节点 |
16 magicdawn 2017-08-27 14:37:46 +08:00 |
18 aliehuhu OP @autoxbc 就是不明白为什么 b[i]可以得到“当时 i 的值”,而 a[i]只能得到“调用时候 i 的值”。 |
19 kotokz 2017-08-27 20:00:07 +08:00 这些都是 Javascript 的坑,尽量用 let |
20 POPOEVER 2017-08-27 20:14:51 +08:00 看你的意图你该在 function 里把 i 传进去呗,直接拿全局 i 当然就是 for 结束后的 10 喽 |
21 autoxbc 2017-08-27 23:22:05 +08:00 @aliehuhu #18 a[i] 被赋值为函数表达式,也就是函数对象。 函数对象只能记录自己在定义时的作用域链,不能记录在定义时作用域链上的变量的瞬时值。 函数引用的变量的值,要在函数被调用时再去读取。 |
22 FrankFang128 2017-08-27 23:57:04 +08:00 跟闭包有毛关系? 原因是执行时机。你把 a[6]() 提前执行不就是 6/7/8/9 了吗? 服了上面一群说闭包的。 |
23 FrankFang128 2017-08-27 23:57:46 +08:00 @autoxbc 所以我说 V2 上面大部分自称前端的都很水。 |
24 lhstock 2017-08-28 00:00:47 +08:00 额,楼上的所有人。我想说。作用域你妹啊。 > document.getElementById('a1').innerHTML = i; //给此元素内容写入 i 循环完了当然是 10 ; 还有 @aliehuhu a[6]()输出结果为 10 这个说法不对。输出是 undefined ;写入的是 10 |
25 lhstock 2017-08-28 00:01:30 +08:00 @FrankFang128 握爪 |
26 FrankFang128 2017-08-28 00:04:04 +08:00 另外,说闭包的人其实说的是「立即执行函数」,这些人把「立即执行函数」称为「闭包」而不自知。 |
27 xman99 2017-08-28 09:44:21 +08:00 b(6) 已经是调用函数了, 没问题啊 |
30 iWtbAbh 2017-08-28 15:08:29 +08:00 @lhstock 嗨呦,我选择说话就是错了, 毕竟 v2 大佬多。 虽然被你恶心到了,但我为自己说的话负责。 "输出是 undefined ;写入的是 10" 避免误导别人,这是过程,就花了不到一分钟 在执行 a[6] () 前 i 已经被赋值了,哪来 undefined ?你能给我看看证据么,万分感谢。 不然我说猜的有错? |