什么是闭包
闭包是指有权访问另一个函数作用域中的变量的函数。
创建闭包的常见方式,就是在一个函数内部创建另一个函数。
闭包就是能够读取其他函数内部变量的函数,可以把闭包简单理解成 ‘定义在一个函数内部的函数
闭包是「函数」和「函数内部能访问到的变量」(也叫环境)的总和。函数对象可以相互关联起来,函数体内部的变量可以保存在函数作用域内, 具有这种特性的函数称为闭包。
for(var i=0;i<10;i++){
setTimeout(function() {
console.log(i);
}, 1000);
}
//10 输出10次10
每次循环会调用setTimeout函数,其中指定了一个timeout后执行的函数
这个函数因为构成闭包的关系,其能够访问外层函数定义的变量,这个变量就是i
在for循环执行完毕后,i的值为10.此时在事件队列中有10个timeout函数等待执行
当timeout时间到时,对应的执行函数调用的i都是同一个,也就是10
for(var i=0;i<10;i++){
(function(e) {
setTimeout(function() {
console.log(e);
}, 1000);
})(i);
}
//0~9
在for循环中定义了匿名立即执行函数
通过将每次循环时产生i传入匿名立即执行函数,立即执行函数就有了一个内部变量e,
其值是传入的i
setTimeout函数形成闭包,能访问到其外层函数也就是匿名立即执行函数的变量e
因为e引用关系的存在,匿名立即执行函数不会被马上销毁掉
timeout时间一到,指定执行函数调用的e就是每次传入的参数i
for(var i=0;i<10;i++){
setTimeout((function(e) {
returnfunction() {
console.log(e);
}
})(i), 1000)
}
//0~9
整个和上面的类似,只不过把匿名立即执行函数传递给setTimeout的第1个参数中
匿名立即执行函数,顾名思义就是需要立即执行的呀。
所以setTimout函数对应的超时执行函数(第1个参数)
为匿名立即执行函数执行的结果,也就是返回的函数。
接下来理解就和上面一样啦
//第一个for这样写也能得到0~9:
for(let i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i);
}, 1000);
}