JavaScript的初學者,很容易迷惑於函數中的this關鍵字,本文簡明扼要地說明了this的含義,包你讀後再也不迷惑。node
一句話解決疑問:函數中的this表明一個對象,具體是哪一個對象取決於函數的調用方式。數組
好的,如今問題變成了這樣:函數有幾種調用方式?每種調用方式中this表明哪一個對象?瀏覽器
設有以下函數:閉包
function setName(name) {
this.name = name;
}複製代碼
咱們如今直接調用它:app
setName('milter');複製代碼
這時,函數setName中的this表明的是一個全局對象,這個對象是代碼的宿主環境提供的,好比在瀏覽器中是window對象,在node.js中是global對象,若是宿主環境中沒有提供這個全局對象,那麼直接調用函數setName將會報錯!函數
還以上面的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調用,接着上面的例子,以下:對象
setName.call(person,'milter');複製代碼
call調用中,call的第一個參數就是this表明的對象,後面的參數表明傳給函數的參數,上面的例子中,this指向person對象,setName函數的參數是字符串'milter'。 apply調用與call調用相似,第一個參數表明this對象,不一樣的是它用數組包含傳給函數的參數。
所謂bind調用,請看示例: var binded = setName.bind(person); binded('milter');
在上面的binded調用中,this指向綁定的person對象。
好了,基本就這五種函數調用方式,若是有遺漏的,歡迎補充。
推薦閱讀:
寫給Android/Java開發者的JavaScript精解(1)
寫給Android/Java開發者的JavaScript精解(2)
寫給Android/Java開發者的JavaScript精解(3)
教你步步爲營掌握JavaScript閉包
歡迎你們關注個人簡書