闭包的含义:
闭包:当内部函数被保存到外部时,将会生成闭包。闭包会导致原有作用域链不释放,照成内存泄漏。
例:
function a(){
var num = 100;
function b(){
num ++;
console.log(num);
}
return b;
}
//此处产生了闭包
var demo = a();
demo(); //101
demo(); //102
闭包的作用:
闭包的作用:
1.实现共有变量。
2.可以做缓存。
3.可以实现封装,属性私有化。
4.模块化开发,防止污染全局变量。
1.实现共有变量:
function test(){
var num = 100; //共有变量
function a(){
num ++;
console.log(num);
}
function b(){
num --
console.log(num);
}
return [a,b];
}
var myArr = test();
myArr[0](); //101
myArr[1](); //100
2.可以做缓存:
function eater(){
var food = "";
var obj = {
eat:function(){
console.log("I am eating " + food);
food = "";
},
push:function(myFood){
food = myFood;
}
}
return obj;
}
var eater1 = eater();
eater1.push("banana"); //缓存
eater1.eat();
立即执行函数:
//立即执行函数
//针对初始化功能的函数
(function (){
var a = 123;
var b = 123;
console.log(a + b);
}())
var a = 10;
var b = 1;
var num = (function (a , b){
return a + b;
}(a,b))
console.log(num);//11
//格式:
//(function(){}()) 建议这种
//(function(){})()
//只有表达式才能被执行符号执行
var test = function(){
console.log("a");
}();
//被执行符号的表达式,就会自动放弃函数名称,也就是能被执行符号执行的函数,就成了立即执行函数
console.log(test) //undefined
+ function test(){
console.log('b');
}();
- function test(){
console.log('c');
}();
闭包与立即执行函数的应用
希望输出0,1,2,3,4,5,6,7,8,9
function test(){
var arr = [];
for(var i = 0; i < 10; i++){
arr[i] = function(){
document.write(i + " ");
}
}
return arr;
}
var myArr = test();
for(var j = 0;j<10;j++){
myArr[j]();
}
结果输出: 10 10 10 10 10 10 10 10 10 10
这是为什么呢?
因为test函数形成闭包,即使test执行完之后被释放了,但是test的作用域链被函数function(){
document.write(i + " ");
}给连上了。myArr[j]()是在test结束之后执行的,所以myArr[j]()执行时都是输出10。
怎么解决这个问题呢?
如下:
function test(){
var arr = [];
for(var i = 0; i < 10; i++){
(function (j){
arr[j] = function(){
document.write(j + " ");
}
}(i))
}
return arr;
}
var myArr = test();
for(var j = 0;j<10;j++){
myArr[j]();
}
其实就是把立即执行函数的执行期上下文,保存在function(){
document.write(j + " ");
}的作用域链上,就是函数的作用域链上等于多了一个执行期上下文。但是这十个立即执行函数的不是一个对象。