您的位置:首页 > 其它

匿名函数 & 闭包 ( 7 章 )

2012-09-21 20:06 127 查看
functionfunctionName(arg0,arg1){

[code]


}


varfunctionName=function(arg0,arg1){




}

[/code]

匿名函数时一种强大的令人难以置信的工具

这两种的区别,前者会在代码执行以前被加载到作用域中,而后者则是在代码执行到那一行的时候才会有定义.

另外的区别是,函数声明(前者)会给函数一个名字,而函数表达式(后者)则是创建一个匿名函数,然后把这个匿名函数赋给一个变量functionName.

关于函数声明,它的一个重要特征就是函数声明提升,意思是在执行代码之前会先读取函数声明,这就意味着可以把函数声明放在调用它的语句后面.

//匿名函数,直接写也是可以的,只不过没有什么实际意义。

把函数想成值时,都可以使用匿名函数例如:

在将函数作为参数传入另一个函数,或者从一个函数中返回另一个函数时,通常都要使用以这种形式来定义匿名函数。


functioncreateCompare(propertyName){

[code]
returnfunction(object1,object2){


varvalue1=object1[propertyName];


varvalue1=object2[propertyName];


if(value1<value2){


return1;


}else{


return-1;


}




};


}

[/code]

递归(用途1)

<SPANstyle="COLOR:#000000">functionfactorial(num){

[code]
if(num<=1){


return1;


}else{


returnnum*factorial(num-1);


}


}


varanotherFactorial=factorial;


factorial=null;


alert(anotherFactorial(4));//出错,因为此时factorial=null,已经不再可用,所以第一次调用没问题,因为使用anotherFactorial指针,可以找到对应的函数,但是函数内部,


//由于是递归函数,所以函数内部的名字factorial失效(null),所以就会出错


returnarguments.callee(num-1);//可以解决问题,之前有提到过,因此递归函数时,使用arguments.callee总比使用函数名好

</SPAN>

[/code]

使用arguments.callee(num–1);


functionfactorial(num){

[code]
if(num<=1){


return1;


}else(


returnnum*arguments.callee(num-1)//其中arguments.callee是一个指向正在执行的函数的指针


)


}


varanotherFactorial=factorial;


factorial=null;


alert(anotherFactorial(4));

[/code]

闭包
闭包是指有权访问另一个函数作用域中的变量的函数.创建闭包的常见方式,是在一个函数内部创建另一个函数,建议非必要时,不要使用闭包,匿名函数也是差不多。

即,闭包是一个函数,是能够访问别的函数作用域变量的函数,那么内部函数肯定能访问外部函数的变量,所以,此时就用到了匿名函数(闭包),所以闭包和匿名函数是什么关系的,是包含关系,即闭包肯定是个匿名函数。例如:


functioncreateComparisonFunction(propertyName){

[code]
returnfunction(object1,object2){


varvalue1=object1[propertyName];


varvalue2=object2[propertyName];


if(value1<value2){


return-1;


}elseif(value1>value2){


return1;


}else{


return0;


}


};


}

[/code]

内部函数访问了外部函数变量prototyName,即使这个内部函数被返回了,而且是在其他地方被调用了,它仍然可以访问变量prototyName,内部函数的作用域链包括外部函数,

当某个函数第一次被调用时,会创建一个执行环境及相应的作用域链,并把作用域链赋值给一个特殊的内部属性[Scope],然后,this,arguments和其他命名参数的值来初始化函数的活动对象.但在作用域链中,内部函数->外部函数->更外部函数->......->最外部函数.(这种包含关系)


functioncompare(value1,value2){

[code]if(value1<value2){
return-1;

}elseif(value1>value2){

return1;

}else{

return0;

}


}


varresult=compare(5,10);

[/code]
Good

(function(){
varname="";//私有变量
Person=function(value){
name=value;
};
Person.prototype.getName=function(){
returnname;
};
Person.prototype.setName=function(value){
name=value;
};

})();

varperson=newPerson("Nicholas");
alert(person.getName());//"Nicholas"
person.setName("Greg");
alert(person.getName());//"Greg"
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: