YOU'VE MADE A BRAVE DECISION, WELCOME.

每一个不曾起舞的日子都是对生命的辜负。

call()和apply()方法

刚开始看到这两个方法的时候始终不能完全的理解,查了好多资料,看了好多文章,感觉理解了但是再次遇到的时候优惠纠结好半天才能理解,而且根本不知道有什么用,后来通过一个漫长的过程才理解,分享下个人心得。

call和apply存在的原因

一个方法,你只有知道他为什么存在,你什么时候能用得上你才能牢记,一个你压根不知道它存在意义的东西你自然不会牢记于心,下面就举一个简单的例子:

function cat(){
    cat.prototype={
        food:"fish",
        say:function(){
            alert("I love"+this.food);
        }
    }
}
var blackCat = new cat;
balckCat.say();

这个运行结果想必大家都知道,页面会弹出“i love fish”。但是有一个对象

whiteDog = {food:"bone"};

而我又不想重新定义say方法,那我们就可以通过call或者apply方法:

blackCat.say.call(whiteDog);

这样页面就会弹出I love bone,这样我们既不需要重新定义say方法,又可以得到我们想要的结果。

call和apply的理解方法

从上面的例子我们就可以看出当一个object没有某个方法,那么我们就可以通过call或者apply来利用其他对象所存在的方法来操作,whiteDog借助了say方法,说白了就是call和apply改变了this的指向,如果想理解call和apply必须对this有深入的理解,举个例子

function chagestyle(attr,value){
    this.style[attr] = value;
}
var box = document.getElementById('box');
changeStyle.call(box,"height","200px");

call中的第一个参数用于指定将要调用此函数的对象,在这里,changeStyle函数将被box对象调用,this指向了box对象,如果不用call的话,就成了changeStyle(“height”,”200px”),程序就会报错,因为this会指向window对象,但window对象是中没有style属性。所以说这里的box就是this的指向,call改变就是this的指向。

call和apply的用法与不同

在call和apply实际上我们已经交代了call和apply的应用场景,这里说下apply和call的具体用法格式和不同,其实call和apply的作用是相同的,只是接受参数的方式不太一样,以上面的例子为例,call的写法

changeStyle.call(box,"height","200px");

apply的写法

changeStyle.apply(box, ['height', '200px']);

从上面我们可以看出apply在第一个参数后面跟的必须是一个数组,两者区别就在于此。javaScript 中,某个函数的参数数量是不固定的,因此要说适用条件的话,当你的参数是明确知道数量时,用 call,而不确定的时候,用 apply,然后把参数 push 进数组传递进去。当参数数量不确定时,函数内部也可以通过 arguments 这个数组来便利所有的参数。

最后

这是本人学习中的个人心得,可能有理解不当的地方,也请各位指正!