匿名函数 & 闭包 ( 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"
相关文章推荐
- 【Python】闭包 & 匿名函数
- 理解javascript的闭包,原型,和匿名函数及IIFE
- javaScript笔记(十二) 匿名函数和闭包
- 高阶函数、闭包、匿名函数
- (T x) => y 匿名函数(lambda 表达式)
- 关于js匿名函数以及闭包的学习(一)
- 匿名函数与闭包的区别
- JavaScript学习-匿名函数和闭包
- JS——作用域 && 闭包
- JavaScript中匿名函数,函数直接量和闭包(转)
- 匿名函数 & Lambda 表达式
- JavaScript 函数声明、函数定义、匿名函数和闭包的区别
- 闭包拾遗 & 垃圾回收机制
- 匿名函数 闭包
- POJ 3660 Cow Contest(关系闭包…
- JavaScript闭包-匿名函数和函数的作用域链
- JS中的匿名函数和闭包
- javascript笔记--(第十六章)匿名函数和闭包
- JavaScript之基础-13 JavaScript Functions (Function对象、创建函数、匿名函数、闭包)
- javascript 学习笔记(三):匿名函数与闭包实例