js:this

這裏寫圖片描述
這是一道面試題。
加上前些天看了幾篇文章,有篇文章講得不錯,拿出來說說。
傳送門: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);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章