1.函数声明语法:
例:function sum (num1,num2){
return num1 + num2;
}
2.函数表达式定义:
var sum = function(num1,num2){
return num1 + num2;
}
3.Function构造函数
var sum = new Function("num1","num2","return num1 + num2");不推荐!!!
5.5.1 没有重载,会被后面的同名函数覆盖
5.5.2 函数声明与函数表达式
解析器会率先读取函数声明,并使其在执行任何代码之前可用(可以访问);
至于函数表达式,则必须等到解析器执行到它所在的代码行,才会真正被执行。
例:
alert(sum(10,10))
function sum (num1,num2){
return num1 + num2;
}
解析器有函数声明提升的过程。
5.5.3 作为值的函数
例:
function add10(num){
return num + 10;
}
var result1 = callSonmeFunction(add10,10);
alert(result1);//20
要访问函数的指针而不执行函数的话,必须去掉函数名后面的那对圆括号。
可以从一个函数中返回了一个函数
例:function createComparisonFunction(propertyName){
return function(object1,object2){
var value1 = object[propertyName];
var value2 = object[propertyName];
if(value1<value2){
return -1;
}else if(value1>value2){
return 1;
}else{
return 0;
}
};
}
var data = [{name:"Zachary",age:28},{name:"Nicholas",age:29}];
data.sort(createComparisonFunction("name"));
alert(data[0].name);//Nicholas
data.sort(createComparisonFunction("age"));
alert(data[0].name);//Zachary
5.5.4 函数内部属性
在函数内部,有两个特殊的对象:arguments和this。
arguments的主要用途是保存函数参数,但这个对象还有一个名叫callee的属性,该属性是一个指针,指向拥有
这个arguments对象的函数
例:阶乘函数
function factorial(num){
if(num<=1){
return 1;
}else{
return num *factorial(num-1);
}
}
问题在于这个函数的执行与函数名factorial紧紧
耦合在了一起。为了消除耦合,可以使用arguments.callee.
例:
function factorial(num){
if(num<=1){
return 1;
}else{
return num*argument.callee(num-1);
}
}
在这个重写后的factorial()函数的函数体内,
没有在引用函数名factorial。这样,无论引用函数时是用什么名字都可以保证完成递归调用.
var trueFactorial = factorial;
factorial = function(num){
return 1;
};
alert(factorial(5));//1
alert(trueFactorial(5));//120
网友评论