关于call、apply、bind
关于这三个方法我们先总结一下他们的异同:
- apply,call,bind三者都是用来改变函数的this对象的指向的
- apply,call,bind三者第一个参数都是this要指向的对象,也就是想制定的上下文
- apply,call,bind三者都可以利用后续参数传参
- apply,call是立即调用的,bind是返回对应函数,便于稍后调用
首先出场的是apply和call
在JS中,call和apply都是为了改变某个函数运行时的上下文而存在的,换句话说,就是为了改变函数内部this的指向。
先来举一个例子:123456789fruits.prototype = {color:'red',say:function(){console.log("My color is "+this.color)}}var apple = new fruitsapple.say() //My color is red
此时函数中的this就是指向fruits的原型链中的color,如果现在有一个对象bannan={color:yellow},我们不想对他重新定义say方法,那么我们可以通过call或者apply的say方法:123456789101112 fruits.prototype = { color:'red', say:function(){ console.log("My color is "+this.color) }}var apple = new fruitsapple.say() //My color is redvar banana = {color:'yellow'}apple.say.call(banana) //My color is yellowapple.say.call(banana) //My color is yellow
可以看出,call和apply是为了动态的改变this而出现的,当一个object没有某个方法,但是其他的有,我们可以借助call或apply用其他的对象的方法来操作。
两者有什么区别呢?
没什么区别,只不过是接受参数的方式不太一样。当你不确定两者有什么区别的时候,就只用一种就好了,反正功能是一样的。就好比问你,叉子和筷子的功能有什么区别,没什么区别,都是把食物放到嘴里面,你硬是要问有什么区别,大概最主要的区别是盘子里的食物不同吧。