call和apply

首先申明,本文是来自阮一峰前辈的文章,还是决定自己在敲一遍,在这里我想不用放大师的链接了(想必太多的人知道了);

apply和call的作用

在javascript中,call和apply都是为了改变某个函数运行的上下文(context)而存在的,换句话说就是改变函数体内部的this指向。

javascript的一大特点就是,函数存在【定义时上下文】和【运行时上下文】以及【上下文是可以改变的】这样的概念。先来个案例

function test(){}
fruits.prototype = {
    color: "red",
    say: function(){
        console.log("color is"+this.color);
}
}

var apple = new fruits;
apple.say(); //color is red

如果现在有个对象banana = {color: “yellow”},我们不想重新定义say方法,那么我们可以通过call或者apply用apple的say方法

banana = {
    color: "yellow"
}
apple.say.call(banana);//color is yellow;
apple.say.apply(banana); //color is yellow;

所以,可以看出call和apply是为了动态的改变this而出现的,当一个object没有某个方法,而其他的有,可以借助call挥着apply用其他对象的方法来操作。

apply和call的区别

对于两者而言,作用完全一样,只是接受的参数不一样,比如:

var func = function(arg1, arg2){

}

可以通过以下方法调用

func.call(this,arg1, arg2);
func.apply(this,[arg1,arg2]);

其中this是你想指定的上下文,它可以是任何一个javascript对象(js中一切皆对象),call需要把参数按顺序传进去,而apply则是把参数放在数组了,在javascript中,某个函数的参数数量是不固定的,因此要说使用条件的话,当你的参数是明确知道的数量时用call,不确定的时候用apply,然后把参数push进数组传递进去,当参数不确定时,函数内部也可以通过arguments这个数组来遍历所有的参数。

call apply的一些使用技巧

1:数组之间追加:

arr1 = ['10','2'];
arr2 = ['5','89'];
Array.prototype.push.apply(arr1, arr2);
console.log(arr1);//['10','2','5','89']

获取数中最大值个最小值

var numbers = [5, 458 , 120 , -215 ];  
var maxNumber = Math.max.apply(Math,numbers);
var maxNumber = Math.max.call(Math,5,458,120,-215);
console.log(maxNumber);//458

验证对象是否为数组

function IsArray(){
    return Object.prototype.toString.call(obj)===='[object Array]';
}

伪数组转换成真正的数组

var domNodes = Array.prototype.slice.call(document.getElementsByTagName("*"));  

解释:

在JavaScript在存在一种伪数组,比较特别的是 arguments对象,还有想document.getElementsByTagName,document.childNodes之类的。它们返回的是NodeList对象都属于伪数组对象,不能应用Array的push,pop等方法,但是我们能使用Array.prototype.slice.call转换成真正的数组带有length属性的对象,就可以使用Array的方法了。
(感觉还是没有彻底的理解,后续再慢慢理解啦)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值