闭包是指有权访问另一个函数作用域中的变量的函数。
创建闭包的常见方式,就是在一个函数内部创建另一个函数。
有关如何创建作用域链以及作用域链有什么作用的细节,对彻底理解闭包至关重要。
当某个函数被调用时,会创建一个执行环境以及响应的作用域链,然后使用argument 和其他命名参数的值来初始化函数的活动对象,但在作用域链中,外部的函数的活动对象始终处于第二位,外部函数的外部函数的活动对象处于第三位…直至作为作用域链终点的全局执行环境。
function compare(value1,value2){
if(value1<value2){
return -1
}else if(value1 > value2){
return 1;
}else{
return 0
}
}
var result = compare(5,10);
以上代码先定义了函数compare,然后又在全局作用域中调用了它。当调用compare()时,会创建一个包含arguments、value1、value2的活动对象,全局执行环境的变量对象(包含result 和compare)在compare()执行韩晶的作用域链中处于第2位。
需要知道的是在创建compare变量的时候,会创建一个预先包含全局变量对象的作用域链,无论什么时候函数访问一个变量时,就会从作用域链中搜索具有相应名字的变量,一般来讲,当函数执行完毕后,局部变量对象就会被销毁,内存中仅保存全局作用域,但是,闭包的情况又有所不同。
参考:javascript高级程序设计