这是一道面试题。
加上前些天看了几篇文章,有篇文章讲得不错,拿出来说说。
传送门:http://mp.weixin.qq.com/s/ksqtCd8ouxU-cVc_HnA4Aw
函数调用
函数调用的三种方式
func(a, b);
obj.method(a, b);
func.call(context, a, b);
似乎前两种我们更加频繁地使用,而第三种则不常用到。
但其实,第三种才是函数调用的真正关键所在。也就是说,可以用第三种的写法来替代前两种。
如何替代呢?
func(a, b);
//等价于
func.call(undefined, a, b);
obj.method(a, b);
//等价于
obj.method.call(obj, a, b);
现在来看一段代码
var obj = {
foo: function(){
console.log(this)
}
}
var bar = obj.foo
obj.foo() // 打印出的 this 是 obj
bar() // 打印出的 this 是 window
原因就在于
bar()
//等价于
bar.call(undefined);
obj.foo()
//等价于
obj.foo.call(obj, a, b);
this丢失问题
var bar = obj.foo
你明明想的是this指向的是obj,但是他却指向了window。
这就是this丢失问题。
如何解决?
var bar = obj.foo.bind(obj);