匿名函数以及闭包
匿名函数就是没有名字的函数。闭包是指有权访问另一个函数作用域中的变量的函数。创建闭包的常见方式是在一个函数的内部创建另一个函数。闭包会携带包含它的函数的作用域,因此会比其他函数占用更多的内存,因此尽量少用闭包。闭包只能取得包含函数中任何变量的最后一个值。闭包的作用域包括它自己的作用域,包含函数的作用域,全局作用域。
每个函数在调用时,其活动对象都会自动取得两个特殊变量:this和arguments。内部函数在搜索这两个变量时,只会搜索到其活动对象(包含函数)为止,不会访问到外部对象。所以如果想访问外部对象的变量,可以把外部作用域中的this对象保存在一个闭包能访问的变量里,这样闭包就可以访问该对象了。例如:
var name = "window";
var object = {
name : 'object',
getFunc : function(){
var that = this; //将外部作用域中的this对象保存在变量that里
return function(){
return that.name; //闭包可以访问变量that,也就是访问外部的this对象
}
}
}
闭包会引用包含函数的整个活动对象。使用完闭包后要解除引用,避免内存泄漏。
块级作用域
用匿名函数模仿块级作用域(私有作用域)的语法如下:
(function(){
//这里是块级作用域
})();
在匿名函数(块级作用域)中定义的变量,都会在执行结束时销毁。在匿名函数中,能够访问包含函数的所有变量。
总结自:《javascript 高级程序设计》