這是一道面試題。
加上前些天看了幾篇文章,有篇文章講得不錯,拿出來說說。
傳送門: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);