用for循环连续按顺序打印1,2,3,4,5(间隔1秒);
于是噼里啪啦写出以下代码:
for(var i =1;i<=5;i++){
setTimeout(() => {
console.log(i);
}, i*1000);
}
于是,一运行,不到啊,怎么都是打印6(涉及到事件循环)。
然后你仔细看了以下代码,哦,把Var改成let不就可以了。
运行了一下,确实可以。
这时候面试官又来了一个问题,请换种方式实现。。
What??
利用闭包
for(var i = 1;i<=5;i++){
(function(i){
setTimeout(function(){
console.log(i);
},i*1000)
})(i)
}
顺便说一下闭包,
其实到目前,我对闭包的理解依旧感觉很浅。
闭包的存在,是因为作用域链,即里层的作用域可以访问外层的作用,反过来则不行。
所以在我看来,闭包就是 为了外层作用域可以访问里层的变量,通过一个函数的返回值将其结果返回出去。
function f1(){
var a = 1;
function f11(){
return a
}
return f11
}
const resultf1 = f1()
console.log(resultf1());
这样解决可以拿到a的值了。
如果直接访问是拿不到的。
注意:如果没有用var,let,const声明的话,会直接变成全局变量。
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()());
猜一猜输出什么?
object.getNameFunc()返回的是一个函数
变成function(){
return this.name;
};
此时已经在全局环境下了,所以this.name是window
如果这样呢?
var name = "The Window";
var object = {
name : "My Object",
getNameFunc : function(){
var that = this;
return function(){
return that.name;
};
}
};
alert(object.getNameFunc()());