JS闭包

什么是闭包

定义

闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式,就是在一个函数内部创建另一个函数。

闭包就是(编译器创建的)执行一段代码所需要的上下文。

闭包的优点:

保护函数内的变量安全,加强了封装性,变量可以一直存储在内存中。

闭包的作用?

通过使用闭包,最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。闭包使得Javascript的垃圾回收机制GC不会回收函数a所占用的资源,因为函数a的内部函数b的执行需要依赖函数a中的变量,这是对闭包作用的非常直白的描述,不专业也不严谨,但大概意思就是这样。也简单讲讲垃圾回收机制吧。

Javascript的垃圾回收机制GC:

在Javascript中,如果一个对象不再被引用,那么这个对象就会被GC回收。如果两个对象互相引用,而不再被第3者所引用,那么这两个互相引用的对象也会被回收。因为函数a被b引用,b又被a外的c引用,这就是为什么函数a执行后不会被回收的原因。

闭包的缺点

闭包最严重的问题就是内存浪费;因为闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。

示例

代码1

1
2
3
4
5
6
7
8
9
10
var name = "The Window"; 
var object = {
name : "My Object",
getNameFunc : function(){
return function(){
return this.name;
};
}
};
alert(object.getNameFunc()());

会显示The Window

代码2

1
2
3
4
5
6
7
8
9
10
11
var name = "The Window"; 
var object = {
name : "My Object",
getNameFunc : function(){
var that = this;
return function(){
return that.name;
};
}
};
alert(object.getNameFunc()());

会显示My Object