易错JavaScript编程题汇总(3)

来源:互联网 发布:去水印软件免费版 编辑:程序博客网 时间:2024/05/20 01:35
for (var i = 0; i < 5; i++) {    setTimeout(function() {        console.log(new Date, i);    }, 1000);}console.log(new Date, i);

A. 20% 的人会快速扫描代码,然后给出结果:0,1,2,3,4,5;
B. 30% 的人会拿着代码逐行看,然后给出结果:5,0,1,2,3,4;
C. 50% 的人会拿着代码仔细琢磨,然后给出结果:5,5,5,5,5,5;
答案其实是 C
如果我们约定,用箭头表示其前后的两次输出之间有 1 秒的时间间隔,而逗号表示其前后的两次输出之间的时间间隔可以忽略,代码实际运行的结果该如何描述?会有下面两种答案:

A. 60% 的人会描述为:5 -> 5 -> 5 -> 5 -> 5,即每个 5 之间都有 1 秒的时间间隔;
B. 40% 的人会描述为:5 -> 5,5,5,5,5,即第 1 个 5 直接输出,1 秒之后,输出 5 个 5;
这里写图片描述
循环执行过程中,几乎同时设置了 5 个定时器,一般情况下,这些定时器都会在 1 秒之后触发,而循环完的输出是立即执行的,显而易见,正确的描述是 B。

如果期望代码的输出变成:5 -> 0,1,2,3,4,该怎么改造代码?熟悉闭包的同学很快能给出下面的解决办法:

for (var i = 0; i < 5; i++) {    (function(j) {  // j = i        setTimeout(function() {            console.log(new Date, j);        }, 1000);    })(i);}console.log(new Date, i);

作者:王仕军
zhuanlan.zhihu.com/p/25855075
参照考点:JavaScript闭包
更多详情见:微信公众号 前端大全

原创粉丝点击