有熟悉 js 的大神么?一个 var 命令疑问

2017-08-27 10:50:36 +08:00
 aliehuhu
<div class="box" id="a1"></div>
<div class="box" id="a2"></div>
<script type="text/javascript">
var a=[],b=[];
for(var i=0;i<10;i++){
a[i] = function(){
document.getElementById('a1').innerHTML = i;
};
b[i] = i;
}
a[6]();
document.getElementById('a2').innerHTML = b[6];
</script>

为什么 a[6]() 输出结果是 10,而 b[6]输出结果是 6 ?
5898 次点击
所在节点    Python
32 条回复
wwqgtxx
2017-08-27 10:55:04 +08:00
因为闭包
ClassicOldSong
2017-08-27 10:55:49 +08:00
典型的闭包问题
we2ex
2017-08-27 11:26:55 +08:00
从 ES6 就不建议用 var 了,用 let 吧
SuperMild
2017-08-27 11:31:49 +08:00
用 let。
在 js 节点右侧栏有个优秀的闭包教程 /go/js
addywu
2017-08-27 11:31:56 +08:00
var 作用域
klesh
2017-08-27 11:32:18 +08:00
a[i] = (function (ii){
return function (){
document.get... = ii;
};
})(i);
Parabolazz
2017-08-27 11:36:04 +08:00
搜索一下 js 闭包
crystom
2017-08-27 11:38:41 +08:00
相当于 var i 是在外面定义的
aliehuhu
2017-08-27 11:53:06 +08:00
@klesh 看了你这个明白了
asdf123101
2017-08-27 11:54:21 +08:00
楼上都说完了不知道该说什么。典型闭包的问题,MDN 上 let 词条里面有例子和解释。
xrr2016
2017-08-27 12:10:10 +08:00
因为运行 `a[6]()` 的时候变量 i 是 10
qq12345454
2017-08-27 12:24:51 +08:00
用 let 或者 const
deepkolos
2017-08-27 12:59:34 +08:00
for 循环结束之后 i 的值为 10
autoxbc
2017-08-27 14:02:29 +08:00
这是求值时机问题,是无形参函数从作用域链检索变量问题

直接说闭包问题,显然是给出了解决方法,却回避了问题自身
siteshen
2017-08-27 14:24:23 +08:00
我就想歪楼问下为啥发在 python 节点
magicdawn
2017-08-27 14:37:46 +08:00
aliehuhu
2017-08-27 18:18:22 +08:00
@siteshen 顶部导航点节点,没找到 js 节点,再看了看 Python 板块,感觉人要多些,就发这里了。
aliehuhu
2017-08-27 18:26:49 +08:00
@autoxbc 就是不明白为什么 b[i]可以得到“当时 i 的值”,而 a[i]只能得到“调用时候 i 的值”。
kotokz
2017-08-27 20:00:07 +08:00
这些都是 javascript 的坑,尽量用 let
POPOEVER
2017-08-27 20:14:51 +08:00
看你的意图你该在 function 里把 i 传进去呗,直接拿全局 i 当然就是 for 结束后的 10 喽

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/386080

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX