《javascript高级程序设计》——引用类型之Function

1.函数实际上是对象,函数名实际上是一个指向函数对象的指针。

function sum(num1,num2){
    return num1+num2;
}
alert(sum(10,10));//20

var anotherSum=sum;
alert(anotherSum(10,10));//20

sum=null;
alert(anotherSum(10,10));//20

因此没有重载,同名函数,后者会覆盖前者。

2.函数声明和函数表达式

//正常运行
alert(sum(10,10));
function sum(num1,num2){
    return num1+num2;
}

//出现错误
alert(sum(10,10));
var sum=function(num1,num2){
    return num1+num2;
};

3.作为值的函数

可以从一个函数中返回另一个函数,例如下面这个例子:

function compare(propertyName){
    return function(obj1,obj2){
        var value1=obj1[propertyName];
        var value2=obj2[propertyName];
        return value2-value1;
    };
}

4.函数内部属性

函数内部有两个特殊的对象:arguments和this。arguments包含着传入函数的所有参数,它有一个callee的属性,这是一个指针,指向拥有该arguments对象的函数。

function fac(num){
    if(num<=1)
        return 1;
    else
        return num*fac(num-1);
}

上述是个典型的求阶乘函数,在其函数内部用到了函数名,这会增加执行与名字的耦合度,因此可以像下面这样:

function fac(num){
    if(num<=1)
        return 1;
    else
        return num*arguments.callee(num-1);
}

var anotherFac=fac;
alert(anotherFac(5));//120

fac=function(){
    return 0;
}
alert(anotherFac(5));//120


this引用的是函数据以执行的环境对象。

window.color="red";

function sayColor(){
    alert(this.color);
}

var o={
    color:"blue"
}

sayColor();//red

o.sayColor=sayColor;
o.sayColor();//blue

还有一个属性:caller。它保存着调用当前函数的函数的引用。

严格模式下不能用arguments.callee和arguments.caller。

5.函数方法

有两个方法:call()和apply()。用途都是在特定的作用域中运行函数。apply接受两个参数:一个是运行函数的作用域,另一个是参数数组。

function sum(num1,num2){
    return num1+num2;
}
function sum2(num1,num2){
    return sum.apply(this,[num1,num2]);
}
function sum3(num1,num2){
    return sum.apply(this,arguments);
}
alert(sum2(10,10));//20
alert(sum3(10,10));//20

call()的区别在于其参数必须逐个列举出来。

function sum4(num1,num2){
    return sum.apply(this,num1,num2);
}
alert(sum4(10,10));//20

上述两个方法的强大之处在于其能够扩大函数赖以运行的作用域。

window.color="red";
var o={color:"blue"};
function sayColor(){
    alert(this.color);
}

sayColor();//red
sayColor.apply(this);//red
sayColor.apply(o);//blue     

显然这样扩充作用域的好处是,对象不需要与方法有任何耦合关系。

函数继承的toString()和toLocaleString()以及valueOf()会返回函数的代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值