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 1
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 1
这是求值时机问题,是无形参函数从作用域链检索变量问题
直接说闭包问题,显然是给出了解决方法,却回避了问题自身 |
15
siteshen 2017-08-27 14:24:23 +08:00 1
我就想歪楼问下为啥发在 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 1
@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 1
另外,说闭包的人其实说的是「立即执行函数」,这些人把「立即执行函数」称为「闭包」而不自知。
|
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 ?你能给我看看证据么,万分感谢。 不然我说猜的有错? |