javascript - 一道经典的JS关于闭包的题
本文介绍了javascript - 一道经典的JS关于闭包的题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
for(var i = 0; i < 5; i++) {
(function() {
setTimeout(function() {
console.log(i);
}, i * 1000);
})(i);
}
问输出什么?
我其实是想问的
是不是可以拆一下,拆成
for(var i=0;i<=5;i++){
function ret(i){
function timer(){
console.log(i);
}
setTimeot(timer,i*1000);
}
ret(i);
}
原题自己跑过了,输出的是5个5
是不是可以理解为:因为根本没有i传入到块级作用域里面去,所以里面跑的还是外面跑完之后的i?
不知道上面的理解的对不对,求大佬指点一下,看了一晚上闭包,看的要死啦....
求大佬推荐IIFE方面的文章,看了好几篇都感觉理解不了闭包和IIFE。
解决方案
第一:因为i没传进去
第二:拆成那样也行,但是你的setTimeout英文掉了个u..,简化一下可以写成如下:
for (var i = 0; i <= 5; i++) {
((i) => setTimeout(() => console.log(i), i * 1000))(i);
}
第三:关于IIFE,给你道题目做吧。。。
题目:请将下列代码至少使用【两种】方法修改,让调用时输出"小明"(调用部分不能更改)
var name = "老王";
var person = {
name: "小明",
whoName: function() {
console.log(this.name);
},
tellMe: function() {
var that = this;
(function(callback) {
callback();
})(that.whoName);
}
};
person.tellMe()//此处不能修改
顺便,你大概不是没理解闭包,而是没理解【匿名函数的作用域】
这篇关于javascript - 一道经典的JS关于闭包的题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文