鍍金池/ 問答/HTML/ js 中this調(diào)用的丟失,方法名調(diào)用和方法名()調(diào)用有什么區(qū)別

js 中this調(diào)用的丟失,方法名調(diào)用和方法名()調(diào)用有什么區(qū)別

var obj = {
  id: 'awesome',
  cool: function coolFn() {
    var _scope = this;
    console.log(_scope.id);
  }
}

var id = 'not awesome';
obj.cool();

 **// 為什么下面這兩段調(diào)用的結(jié)果不一樣, this 的指向問題**
// 為什么obj.cool,和obj.cool()有什么不同,結(jié)果也是不一樣的
setTimeout(obj.cool,100) // not awesome
setTimeout(obj.cool(),100) // awesome 
回答
編輯回答
挽歌

定時器的第一個參數(shù)為一個函數(shù),或一段代碼塊(如"console.log('a')"),當(dāng)參數(shù)為函數(shù)時,函數(shù)中的this將指向window,解決:setTimeout(obj.cool.bind(obj),100)或者setTimeout(function(){obj.cool()},100)

至于第二個定時器在讀到這句的時候會立即執(zhí)行obj.cool(),也就是打印一次awesome,然后將字符串a(chǎn)wesome作為定時器的第一個參數(shù),這不是一個函數(shù)或一段可執(zhí)行的代碼塊,所以這個定時器觸發(fā)的時候會報錯

2017年11月3日 05:08
編輯回答
生性

這個是this的隱式綁定和隱式丟失問題。
一般地,被直接對象所包含的函數(shù)調(diào)用時,也稱為方法調(diào)用,this隱式綁定到該直接對象;
隱式丟失是指被隱式綁定的函數(shù)丟失綁定對象,從而默認綁定到全局對象或者undefined上。
你這是因為參數(shù)傳遞導(dǎo)致了隱式賦值。
可以看看這個文章傳送門和小黃書上冊85面

2018年1月16日 00:05