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

2017 年 8 月 27 日
 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 ?
6521 次点击
所在节点    Python
32 条回复
wwqgtxx
2017 年 8 月 27 日
因为闭包
ClassicOldSong
2017 年 8 月 27 日
典型的闭包问题
we2ex
2017 年 8 月 27 日
从 ES6 就不建议用 var 了,用 let 吧
SuperMild
2017 年 8 月 27 日
用 let。
在 js 节点右侧栏有个优秀的闭包教程 /go/js
addywu
2017 年 8 月 27 日
var 作用域
klesh
2017 年 8 月 27 日
a[i] = (function (ii){
return function (){
document.get... = ii;
};
})(i);
Parabolazz
2017 年 8 月 27 日
搜索一下 js 闭包
crystom
2017 年 8 月 27 日
相当于 var i 是在外面定义的
aliehuhu
2017 年 8 月 27 日
@klesh 看了你这个明白了
asdf123101
2017 年 8 月 27 日
楼上都说完了不知道该说什么。典型闭包的问题,MDN 上 let 词条里面有例子和解释。
xrr2016
2017 年 8 月 27 日
因为运行 `a[6]()` 的时候变量 i 是 10
qq12345454
2017 年 8 月 27 日
用 let 或者 const
deepkolos
2017 年 8 月 27 日
for 循环结束之后 i 的值为 10
autoxbc
2017 年 8 月 27 日
这是求值时机问题,是无形参函数从作用域链检索变量问题

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

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

https://study.congcong.us/t/386080

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

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

© 2021 V2EX