闭包通常用来创建内部变量,使得这些变量不能被外部随意修改,同时又可以通过指定的函数接口来操作。
类似于面向对象中 的构造器,通过闭包实现 private 和 public 变量的声明。
(1)、使用闭包主要是为了设计私有的方法和变量。闭包的优点是可以避免全局变量的污染,缺点是闭包会常驻内存,会增大内存使用量,使用不当很容易造成内存泄露。
(2)、闭包有三个特性:
a、函数嵌套函数
b、函数内部可以引用外部的参数和变量
c、参数和变量不会被垃圾回收机制回收
作用域就不说了,先来理解一个概念:作用域链
当定义一个函数时,它实际上保存一个作用域链。
当调用这个函数时,它创建一个新的对象来存储他的局部变量,并将这个对象添加至保存的那个作用域链上,同时创建一个新的更长的表示函数调用作用域的‘链’。
下面来举个栗子:
function checkscope(){
var scope = 'L Scope';
function f(){
return scope;
}
return f();
}
checkscope(); // ‘L Scope’
var scope = 'G scope';
function checkscope(){
var scope = 'L Scope';
function f(){
return scope;
}
return f;
}
checkscope()(); // 'L Scope'
function f1(){
var n=999;
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
如何让这些变量的值始终保持在内存中呢?
function f1(){
var n=999;
nAdd=function(){n+=1}
function f2(){
alert(n);
}
return f2;
}
var result=f1();
result(); // 999
nAdd();
result(); // 1000
result = null;//销毁匿名函数,闭包所包含的活动对象也就一起释放了
var result=f1();
result(); // 999
函数作为返回值时,连同函数定义时的环境(包括函数外部,函数可以访问到的变量)一起返回,确保这些变量不因其依附的对象销毁而被销毁。
这就是闭包的作用。