闭包就是可以访问其他函数内部的变量的函数,是把内部函数与外部函数连接起来的桥梁。闭包的目的是为了隐藏变量,这个变量不想暴露在全局环境中,就需要定义在函数内部,形成局部作用域,同时向外部暴露一个方法,通过这个方法可以访问这个变量,就需要return 一个函数;
闭包需要函数套函数,再return 一个函数,
函数里面套函数,是为了制造局部函数作用域,return一个函数是为了内部的函数可以被调用,从而形成闭包;
function aa(){
for(var i=0; i<10;i++){
setTimeout(function(){
console.log(i)
},2000);
}
}
结果:9 9 9 9 9 9 9 9 9
因为,setTimeout会把执行的函数放在堆栈中暂时不执行,2000ms后开始执行,i是全局变量,此时的值是9,所以输出的都是9
解决办法: var 改成let ,let定义局部变量,或者直接改成立即执行函数,形成局部作用域
function aa(){
for(let i=0; i<10;i++){
setTimeout(function(){
console.log(i)
},2000);
}
}
function aa(){
for(var i=0; i<10;i++){
setTimeout(
(function(){console.log(i)})()
,2000);
}
}