函数
作为值的函数
function calculate(func,arg1,arg2){
return func(arg1,arg2);
}
function add(num1,num2){
return num1+num2;
}
var result=calculate(add,44,56);
alert(result);/100
在这个例子中,add函数作为calculate的参数被调用,这样也是可以的,要访问函数的指针而不是调用函数时,要去掉函数名后面的括号。
//作为sort的函数使用
function compare(propertyName){
return function (obj1,obj2){
var value1=obj1[propertyName];
var value2=obj2[propertyName];
if (value1>value2) {
return 1
}else if(value1<value2){
return -1
}else{
return 0
}
};
}
var data=[{name:"apple",color:"red"},{name:"banana",color:"yellow"}];
data.sort(compare(name));
alert(data[0].color);//red
函数的内部属性
函数内部都有两个特殊的对象,他们分别是arguments和this
arguments是一个类数组对象,包含着传入函数中的所有参数,他有一个名叫callee的属性,这个属性呢是一个指针,指向拥有这个arguments对象的函数。
用他我们可以来写一个非常经典的阶乘函数
//不运用arguments
function factorial(num){
if (num<=1) {
return 1
}else{
return num*factorial(num-1)
}
}
//运用argument
function factorial(num){
if(num<=1){
return 1;
}else{
return num*arguments.callee(num-1)
}
在这个运用argumnts的函数中,没有引用函数名,使得无论函数使用什么名字,都能保证递归的完成
*callee还有一个大兄弟叫caller,他这个大兄弟的保存着调用当前函数的函数的引用,
比如下面这个例子,outer()中调用了inner(),在inner中利用arguments.callee.caller返回了outer()函数。
function outer(){
inner();
}
function inner(){
alert(inner.caller);
}
outer();
另一个特殊对象是this,this引用的是函数据以执行的环境对象。不同的环境下,this的指向不同,如下例
window.color="red";
var exp={color:"blue"};
function sayColor(){
alert(this.color);
}
sayColor();//red
exp.sayColor=sayColor;
exp.sayColor();//blue
sayColor();//red