创建闭包(closures)的方式:在一个函数内部创建另一个函数
闭包:函数内部的函数有权访问函数作用域的变量
实例1:
for(var i = 0; i < 10; i++) {
setTimeout(function() {
console.log(i);
}, 10);
}
分析:输出结果为10次10。setTimeout函数是异步函数,会在当前的调用栈完成后执行,即循环完成之后执行。闭包内部引用的是外部变量i,i的值为10,因此,输出结果都是10;
实例2:
for(var i = 0; i < 10; i++) {
setTimeout((function(num) {
console.log(num);
})(i), 10)
}
分析:通过创建IIFE(自执行函数表达式)让结果输出1-9;
它会创建一个作用域,将i传递进去。此时,i是一个局部变量,(不再是在闭包中引用i)。
实例3:
function createFunctions(){
var result=[];
for (var i = 0; i < 10; i++) {
result[i]=function(){
return i;
};
}
return result;
}
var arr=createFunctions();
console.log(arr);
for (var i = 0; i < arr.length; i++) {
console.log(arr[i]());
}
分析:结果为10次10;实例四:
function createFunctions(){
var result=[];
for (var i = 0; i < 10; i++) {
result[i]=(function(num){
return num;
})(i);
}
return result;
}
var arr=createFunctions();
console.log(arr);
分析:输出结果为[0,1,2,3,4,5,6,7,8,9];
欢迎指正!