闭包简介:
闭包:能够访问另一个函数作用域的变量的函数。
清晰的讲:闭包就是一个函数,这个函数能够访问其他函数的作用域中的变量。
闭包定义:
如果在一个内部函数里,对在外部作用域(但不是全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。
闭包作用:
- 可以在函数的外部访问到函数内部的局部变量。
- 让这些变量始终保存在内存中,不会随着函数的结束而自动销毁。
闭包应用:
- 实现公有变量。
- 可以做缓存(存储结构)。
- 可以实现封装,属性私有化。
- 模块化开发,防止污染全局变量。
闭包最简结构如下:
function outer() {
var a = '变量1';
var inner = function () {
console.info(a);
}
return inner; // inner 就是一个闭包函数,因为他能够访问到outer函数的作用域
}
var inner = outer(); // 获得inner闭包函数
inner(); //"变量1"
解决闭包问题:
function test () {
var arr = [];
for (var i = 0; i < 10; i++) {
// arr[i] = function() {
// console.log(i); //此时会打印10个10
// }
(function (j) {
arr[j] = function () {
console.log(j); //此时依次打印0-9
}
}(i)) //立即执行函数
}
return arr;
}
var myArr = test();
console.log(myArr + "ww");
for (var j= 0; j< 10; j++) {
myArr[j]();
}
1.注释的代码本来是for循环里面的多个function (){}被保存到外面,而只有函数才能被执行,function (){}只是一个声明,无法执行,所以里面的i进不到function (){}内部去,等到for循环结束的时候,即i=10的时候此时i才进入function (){}内部。
2.于是做个了修改,为了将function (){}变成函数,就用立即执行函数这个方法,然后用j来接收i的值,最后返回。