function fn(i)
{
return i;
}
alert(fn(0));当函数被调用的时候,在作用域链顶部创建一个他的调用对象,函数的参数、变量等在调用对象中都有定义,调用对象的下一层为全局对象。当检测到不再有对函数的引用时,调用对象即被删除。在上边例子中,fn(0)调用fn时,创建了fn的调用对象,其里面有对i的定义。
同一个函数多次调用时,将会创建多个调用对象,举例:
function fn(i)
{
return function(){return i};
}
var a = [fn(0),fn(1),fn(2)];
alert(a[0]()); //调用对象中i值为0
alert(a[1]()); //调用对象中i值为1
alert(a[2]()); //调用对象中i值为22.闭包
function f()
{
var i = 0;
var g= function(){return ++i;};
return g;
}
var fn= f();
alert(fn());
alert(fn());
alert(fn());执行结果:
1
2
3
说明:当调用f时,创建了f的调用对象,里边包含有i和g的定义,fn中包含了对g引用,所以,当给fn赋值之后,虽然后面的代码中不再有对f的引用,但f的调用对象仍不会被删除(若删除了调用对象,fn将无法使用)。当调用fn时,作用域链上就有三个对象:fn的调用对象、f的调用对象和全局对象,由于f的调用对象未被删除,那么他的属性i对于fn而言就相当于是一个全局变量,所以多次调用fn时,i的值将递增。
上例简写:
var fn = (function(){
var i = 0;
return function(){ return ++i; };
})();
alert(fn());
alert(fn());
alert(fn());JavaScript函数是将要执行的代码以及执行这些代码的作用域构成的一个综合体,这种代码和作用域的综合体就叫做闭包。JavaScript中所有的函数都是一个闭包,但只有当一个嵌套函数被导出到它所定义的作用域外时,这种闭包才强大。
评论(0)
暂无评论。