不得不學的js技巧之關鍵字this

JavaScript的初學者,很容易迷惑於函數中的this關鍵字,本文簡明扼要地說明了this的含義,包你讀後再也不迷惑。node

一句話解決疑問:函數中的this表明一個對象,具體是哪一個對象取決於函數的調用方式。數組

好的,如今問題變成了這樣:函數有幾種調用方式?每種調用方式中this表明哪一個對象?瀏覽器

調用方式一:直接調用

設有以下函數:閉包

function setName(name) {
  this.name = name;

}複製代碼

咱們如今直接調用它:app

setName('milter');複製代碼

這時,函數setName中的this表明的是一個全局對象,這個對象是代碼的宿主環境提供的,好比在瀏覽器中是window對象,在node.js中是global對象,若是宿主環境中沒有提供這個全局對象,那麼直接調用函數setName將會報錯!函數

調用方式二:new 調用

還以上面的setName函數爲例,new 調用是指這樣: new setName('milter'); 本人以前的文章講過,對函數進行new 調用時,解釋器會建立一個新的對象,this就指向這個新的對象,函數最後也會返回這個新的對象。this

調用方式三:引用調用

假設有這樣一個對象: var person = { } 咱們將函數setName賦值給person的一個屬性,以下: person.setName = setName ; 此時,經過person.setName調用函數就是引用調用,以下:spa

person.setName('milter');複製代碼

引用調用函數時,this指向引用所屬的對象,在上面的例子中,就是setName屬性所屬的對象person。code

調用方式四:call和apply調用

先說call調用,接着上面的例子,以下:對象

setName.call(person,'milter');複製代碼

call調用中,call的第一個參數就是this表明的對象,後面的參數表明傳給函數的參數,上面的例子中,this指向person對象,setName函數的參數是字符串'milter'。 apply調用與call調用相似,第一個參數表明this對象,不一樣的是它用數組包含傳給函數的參數。

調用方式五:bind調用

所謂bind調用,請看示例: var binded = setName.bind(person); binded('milter'); 在上面的binded調用中,this指向綁定的person對象。

好了,基本就這五種函數調用方式,若是有遺漏的,歡迎補充。

推薦閱讀:
寫給Android/Java開發者的JavaScript精解(1)
寫給Android/Java開發者的JavaScript精解(2)
寫給Android/Java開發者的JavaScript精解(3)
教你步步爲營掌握JavaScript閉包

歡迎你們關注個人簡書

相關文章
相關標籤/搜索