1.闭包(closure)维基百科
-
基本概念:闭包是指有权访问另外一个函数作用域中变量的函数。
-
示例:
var scope="global scope"; //全局变量
function checkscope(){
var scope="local scope"; //局部变量
function f(){
return scope; //在作用域中返回这值
};
return f();
}
checkscope(); //=>"local scope"
-
说明:当一个函数嵌套了另一个函数,外部的函数将嵌套的函数对象作为返回值返回,就形成了闭包。函数定义在栈中,执行结束后内存会被释放掉,每次调用js函数的时候,都会为之创建一个新的对象来保存局部变量。闭包不同于普通的构造函数的地方在与局部变量会被保存下来。设想一下外部函数在调用之后内存被释放掉了,那么他的局部变量也就不存在了,这时候返回值是嵌套函数,嵌套函数需要return外部函数的变量。这个时候是不是就会报错,所以闭包就存在了。
-
实现原理:函数的作用域链
-
闭包的用途:
- 私有化变量,避免全局污染;
- 可访问函数内部的变量;
-
闭包的缺点:会导致变量一直储存在内存中,过多会造成内存泄漏。
-
闭包的应用
- 需要实现一个变量b的自增
//可以实现自增,但是污染了全局变量
var b = 10;
function Add(){
b++;
console.log(b);
}
Add();
Add();
Add();
//不污染全局,但是不能自增
var b = 10;
function Add2(){
var b = 10;
b++;
console.log(b);
}
Add2();
Add2();
Add2();
console.log(b);
//完成实现
var b = 10;
function Add3(){
var b = 10;
return function(){
b++;
return b;
};
};
var cc = Add3();
console.log(cc());
console.log(cc());
console.log(cc());
console.log(b);