105-js循环和闭包示例
发布时间:2022-10-25 10:39:47 1974
相关标签:
代码1:
for (var i=1; i<=5; i++) {
setTimeout(function timer() {
console.log(i);
}, i*1000 );
}
正常情况下,我们对这段代码行为的预期是分别输出数字1~5,每秒一次,每次一个。
但实际上,这段代码在运行时会以每秒一次的频率输出五次6。
代码2:
for (var i=1; i<=5; i++) {
(function() {
setTimeout(function timer() {
console.log(i);
}, i*1000 );
})();
}
结果还是: 以每秒一次的频率输出五次6。
代码3:
for (var i=1; i<=5; i++) {
(function() {
var j = i;
setTimeout(function timer() {
console.log(j);
}, j*1000 );
})();
}
结果就正常了:分别输出数字1~5,每秒一次,每次一个
代码4(改进):
for (var i=1; i<=5; i++) {
(function(j) {
setTimeout(function timer() {
console.log(j);
}, j*1000 );
})(i);
}
代码4(再改进):
for (var i=1; i<=5; i++) {
let j = i; // 是的,闭包的块作用域!
setTimeout( function timer() {
console.log(j);
}, j*1000 );
}
代码5(再改进):
for (let i=1; i<=5; i++) {
setTimeout(function timer() {
console.log(i);
}, i*1000 );
}
说明:
let声明,可以用来劫持块作用域,并且在这个块作用域中声明一个变量。
块作用域和闭包联手便可天下无敌
知识点来源:
《你不知道的JavaScript(上卷)》,5.4 循环和闭包
文章来源: https://blog.51cto.com/u_14816966/5787108
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报