每一个不曾起舞的日子都是对生命的辜负。
刚开始看到这两个方法的时候始终不能完全的理解,查了好多资料,看了好多文章,感觉理解了但是再次遇到的时候优惠纠结好半天才能理解,而且根本不知道有什么用,后来通过一个漫长的过程才理解,分享下个人心得。
一个方法,你只有知道他为什么存在,你什么时候能用得上你才能牢记,一个你压根不知道它存在意义的东西你自然不会牢记于心,下面就举一个简单的例子:
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方法,又可以得到我们想要的结果。
从上面的例子我们就可以看出当一个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的应用场景,这里说下apply和call的具体用法格式和不同,其实call和apply的作用是相同的,只是接受参数的方式不太一样,以上面的例子为例,call的写法
changeStyle.call(box,"height","200px");
apply的写法
changeStyle.apply(box, ['height', '200px']);
从上面我们可以看出apply在第一个参数后面跟的必须是一个数组,两者区别就在于此。javaScript 中,某个函数的参数数量是不固定的,因此要说适用条件的话,当你的参数是明确知道数量时,用 call,而不确定的时候,用 apply,然后把参数 push 进数组传递进去。当参数数量不确定时,函数内部也可以通过 arguments 这个数组来便利所有的参数。
这是本人学习中的个人心得,可能有理解不当的地方,也请各位指正!