在Javascript中,函数会在各种不同上下文中被使用,函数中的this一般会被自动设置,但是你可以改变this的值来改变函数运行时的上下文。因为 JavaScript 的函数存在“定义时上下文”和“运行时上下文”以及“上下文是可以改变的”这样的概念。
有3种函数方法允许你改变this的值。函数是对象,所以函数也有方法。
1,call()方法;
2,apply()方法;
3,bind()方法;
bind()方法是ES5中新增的,而call()和apply()是我们经常使用也是经常被问到的。
下面开始区别call()和apply()。
相同点:两个方法的作用是完全一样的。
不同点:两个方法使用时的参数不一样,call()第一个参数是函数执行时this的值,其后所有的参数都是需要被传入函数的参数;apply()只接受两个参数,第一个参数也是this的值,第二个参数是一个数组或伪数组,内含函数需要被传入的参数。
如何更好的去理解call()和apply()的使用?看下面的代码演示。
var dog = {
name:'旺财',
say:function(words){
console.log('我是'+this.name+','+words);
}
};
var cat = {name:'咪咪'};
dog.say('旺旺!'); // 我是旺财,旺旺!
dog.say.call(cat,'喵喵~'); // 我是咪咪,喵喵~
dog.say.apply(cat,['喵喵~']); // 我是咪咪,喵喵~
两个对象dog和cat,dog有say()方法,cat没有,cat可以借用dog.say()实现,上面代码展示了call()和apply()的用法。
先明确要用谁的什么方法,谁用,谁就是第一个参数。
这里为了搞清对象的顺序,可以假定dog是大爷,它有say方法,cat为了向dog借用say方法,就要先讨好dog,因此在书写代码时,就要先把大爷放前面,先写对象,然后要借大爷什么方法,谁借,谁就在大爷屁股后面跟着。