您好,登錄后才能下訂單哦!
本文小編為大家詳細介紹“javascript的this指向怎么理解”,內容詳細,步驟清晰,細節處理妥當,希望這篇“javascript的this指向怎么理解”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來學習新知識吧。
在我們看見的各種介紹如何判斷this的指向方法中,"this的最終指向的是那個調用它的對象" 這句話被視作核心,但是面對多種多樣的情況,我們容易搞混。針對針對多種情況結合我的理解,我提出了一句話 “箭頭,定時和構造,特殊情況特殊看,普通調用看點號,后面有點不看前,然后就近原則判,最后剩下就是window”。
箭頭函數
箭頭函數的本身沒有this,所有不存在this改變,它捕獲外層的this使用
var name = "windowsName"; var a = { name: "Cherry", fn() { setTimeout(()=>{ console.log(this.name); },0) } } a.fn() //Cherry
解析: 首先對象a調用fn函數,所以fn函數的this指向對象a,然后箭頭捕獲外層this,那么就不是setTimeout里的this,而是fn函數的this,所以最后拿到對象a里的name
定時器
對于延時函數內部的回調函數的this指向全局對象window
var name = "windowsName"; var a = { name: "Cherry", fn() { setTimeout(function (){ console.log(this.name); },0) } } a.fn() //windowsName
解析: 首先對象a調用fn函數,然后這里setTimeout里的回調函數是匿名函數,為普通的函數,那么匿名函數中的this指向的就是window
var name = "windowsName"; var b={ name: "setTimeoutName" } var a = { name: "Cherry", fn() { setTimeout((function (){ console.log(this.name); }).bind(b),0) } } a.fn() //setTimeoutName
解析:首先對象a調用fn函數,然后這里setTimeout里的回調函數是匿名函數,為普通的函數,那么匿名函數中的this指向的就是window,但使用bind改變匿名函數的this指向為對象b,所以最后對象b里的name
構造函數
構造函數中的this指向創建的實例對象,
注意:如果構造函數中返回一個對象,創建時不會有新的實例對象,而是這個返回的對象
function fn(){ this.age = 37; } var a = new fn(); console.log(a.age); // 37 a.age = 38; console.log(fn); // { this.age = 37; } console.log(a.age); // 38
解析:這里我們通過構造函數創建實例對象a,相當于開辟一個新地方將構造函數內容復制過來,就有了a對象,這時候this指向的就是對象a,我們修改對象a中內容不影響構造函數
點號判斷
通過.
判斷this指向,遵循就近原則
var a = { age:10, b: { age:12, fn(){ console.log(this.age); } } } a.b.fn(); //12
解析:對象a調用對象b的fn函數,fn函數前面有兩個.
,那么最近的是對象b,所以fn函數的this指向的就是對象b,最后拿到的就是對象b的age
var a = { age:10, b: { age:12, fn(){ console.log(this.age); //undefined } } } var c = { age:20, } var d = { age:30, } a.b.fn.bind(c).bind(d)(); //20
解析:對象a調用對象b的fn函數然后使用bind改變this的指向,這時候fn前后前后都有.
,不看前面的.
,只用看后面的,然后最近的bind改變this指向為c,那么此時fn函數的this指向的就是對象c,拿到的就是對象c的age
練習
function outerFunc() { console.log(this) // { x: 1 } function func() { console.log(this) // Window } func() } outerFunc.bind({ x: 1 })()
obj = { func() { const arrowFunc = () => { console.log(this._name) } return arrowFunc }, _name: "obj", } obj.func()() //obj func = obj.func func()() //undefined obj.func.bind({ _name: "newObj" })()() //newObj obj.func.bind()()() //undefined obj.func.bind({ _name: "bindObj" }).apply({ _name: "applyObj" })() //bindObj
使用 apply、call、bind 函數可以改變this的指向,上面this的例子中使用到
區別
thisArg , [ argsArray]
call(thisArg, arg1, arg2, ...)
apply和call函數區別在于this后面傳入的參數,apply中傳的是一個數組,而call中傳入的是展開的參數
bind(thisArg[, arg1[, arg2[, ...]]])()
然后bind函數創建的是一個新的函數,需要手動去調用
這個新函數的 this
被指定為 bind()
的第一個參數,而其余參數將作為新函數的參數,供調用時使用
讀到這里,這篇“javascript的this指向怎么理解”文章已經介紹完畢,想要掌握這篇文章的知識點還需要大家自己動手實踐使用過才能領會,如果想了解更多相關內容的文章,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。