函数对象可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数的作用内,这种特性就是闭包。
从技术的角度来讲,所有的JavaScript函数都是闭包:它们都是对象,它们都关联到作用域链。
var scope = "global scope";
function checkscope(){
var scope = "local scope";
function check(){
return scope;
}
return check();
}
checkscope();函数申明了一个局部变量,并定义了check()函数。
结果返回:local scope
我们也可以理解为:返回函数内部变量的方法叫做闭包。
这样你就很容易的理解闭包:函数定义时的作用域链到函数执行时依然有效。
正常情况,我们每次调用JavaScript函数的时候,都会为之创建一个新的对象来保存局部变量,把这个对象添加至作用域链中。当函数返回的时候,就从作用域链中将这个绑定的变量对象删除。如果不存在嵌套的函数,也没有其他引用指向这个绑定对象,它就会被系统当做垃圾回收。如果定义了嵌套函数,每个函数的函数都各自独立的对应一个作用域链,并且这个作用域链指向一个变量绑定对象。但如果这些函数嵌套的对象在外部函数中保存下来,那么它们也会和所指向的变量绑定对象一样当做垃圾回收。但是如果这个函数定义了嵌套函数,并将它作为返回值返回或存储在某个属性中,这时就会有一个外部引用指向这个嵌套函数。它就不会被垃圾回收,并且它所指向的变量绑定的对象也不会被当做垃圾回收。