javascript之改变this指向

202 阅读1分钟

一、相信前端面试都会常遇到关于this的问题,关于bind,call已经apply这三个api大家应该都不陌生了,那我今天就来记录一下它们到底怎么用吧。

var obj1 = { num : 20, fn : function(n){ console.log(this.num+n); } }; 

var obj2 = { num : 15, fn : function(n){ console.log(this.num-n); } }; 

obj1.fn.call(obj2,10);

大家觉得上面的结果会是多少呢?先分析一下call,它接了两个参数,第一个参数是指定this的宿主,意思就是this指向obj2,第二个参数就是传递到obj1中去的,那么obj1中的fn方法中的this本来是指向obj1的,由于用了call,那么它的指向就变为obj2了,由此可知结果就是25了。

举例完call,那么apply的用法跟它一样,只不过第二个参数接的是一个数组而已,这两个的区别就在于第二个参数的类型不同。至于bind

var name = 'bb';
var obj = {
name:'kk',
setName:function(){
console.log(this.name)
}
}
var otherName = obj.setName();
console.log(otherName)//结果是bb
otherName = otherName.bind(obj);
console.log(otherName)//结果是kk

bind也可以改变this指向,但是它跟上面两个最大的区别是不会自动执行改变this指向后的方法,需要再次手动调用,到此你get到了吗。