有熟悉 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 ?
5900 次点击
所在节点    Python
32 条回复
autoxbc
2017-08-27 23:22:05 +08:00
@aliehuhu #18

a[i] 被赋值为函数表达式,也就是函数对象。

函数对象只能记录自己在定义时的作用域链,不能记录在定义时作用域链上的变量的瞬时值。

函数引用的变量的值,要在函数被调用时再去读取。
FrankFang128
2017-08-27 23:57:04 +08:00
跟闭包有毛关系?
原因是执行时机。你把 a[6]() 提前执行不就是 6/7/8/9 了吗?
服了上面一群说闭包的。
FrankFang128
2017-08-27 23:57:46 +08:00
@autoxbc 所以我说 V2 上面大部分自称前端的都很水。
lhstock
2017-08-28 00:00:47 +08:00
额,楼上的所有人。我想说。作用域你妹啊。
> document.getElementById('a1').innerHTML = i; //给此元素内容写入 i

循环完了当然是 10 ;
还有
@aliehuhu
a[6]()输出结果为 10 这个说法不对。输出是 undefined ;写入的是 10
lhstock
2017-08-28 00:01:30 +08:00
@FrankFang128 握爪
FrankFang128
2017-08-28 00:04:04 +08:00
另外,说闭包的人其实说的是「立即执行函数」,这些人把「立即执行函数」称为「闭包」而不自知。
xman99
2017-08-28 09:44:21 +08:00
b(6) 已经是调用函数了, 没问题啊
iWtbAbh
2017-08-28 09:54:45 +08:00
@aliehuhu 别被误导。
@lhstock 与其去猜,加上 debugger 在浏览器里跑一遍,就知道了。
lhstock
2017-08-28 12:00:05 +08:00
@iWtbAbh 你在猜啊。那闭嘴吧
iWtbAbh
2017-08-28 15:08:29 +08:00
@lhstock 嗨呦,我选择说话就是错了, 毕竟 v2 大佬多。

虽然被你恶心到了,但我为自己说的话负责。

"输出是 undefined ;写入的是 10"

避免误导别人,这是过程,就花了不到一分钟

![]( )

在执行 a[6] () 前 i 已经被赋值了,哪来 undefined ?你能给我看看证据么,万分感谢。

不然我说猜的有错?
lhstock
2017-08-28 17:17:18 +08:00
@iWtbAbh
提问原话为:“为什么 a[6]() 输出结果是 10,而 b[6]输出结果是 6 ?”
我理解为:console.log(a[6]());console.log(b[6]);

被赋值的是 a[6];
而 a[6]=Fun ;

没有返回值;自然是 undefined ;
不然换个说法 a[6]是个方法;方法哪有值;
有错么;
你要不服你把代码 56 行替换为'''console.log(a[6]() '''好吧;
基本概念理解有误导致描述有误;
无脑喷什么
iWtbAbh
2017-08-28 18:00:30 +08:00
@lhstock 不好意思,是我理解错了。

a[6]() 没有 return , 默认返回 undefined。

而我把楼主问的问题加了自己主观的理解, 理解成输出结果的是 i 。

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

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

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

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

© 2021 V2EX