JavaScript中的call和apply

1.call和apply作用
call和apply都是为了改变某个函数运行时的context即上下文而存在的,换句话说,就是为了改变函数体内部this的指向。因为JS函数存在定义时上下文、运行时上下文以及上下文可以改变这样的概念。下面例子可以说明它们存在的原因:
在js oop中,我们经常这样定义:

function Cat(){
}

cat.property = {
    food:'fish',
    say:function(){
        alert('I love '+this.food);
    }
}

var blackCat = new Cat();
blackCat.say();

但,如果我们有一个对象whiteDog={food:’bone’},我们不想对它重新定义say方法,那么我们可以通过call或者apply调用blackCat的say方法:

blackCat.say.call(whiteDog);
blackCat.say.apply(whiteDog);

从上面例子可以看出call和apply是为了动态改变this出现的,当一个object对象没有某个方法,但其他对象有,就可以借助call或者apply用其他对象的方法。
再举一个常用的例子:
document.getElementsByTagName(‘*’)是一种类似array的array,不能用Array下的方法,通过call,它可以调用Array的slice方法,彻底变成数组,就可以采用Array的所有方法了

var domNodes = Array.property.slice.call(document.getElementsByTagName('*'));

2.call和apply区别
二者的作用完全一样,只是接受参数的方式不太一样。
若一个函数func定义如下:

var fun = function(arg1,arg2);

可以通过如下方式调用:

func.call(thisOject,arg1,arg2);//thisObject可选,是要指定的上下文,默认为Global对象
func.apply(thisObject,[arg1,arg2]);

call需要把参数按顺序传递进去,而apply则是把参数放到数组里。
JavaScript中,某个函数的参数数量是不固定的,因此,当参数数量明确知道时,用call;参数数量不确定时,用apply,把参数push进数组传递进去。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值