this的理解
了解this是的前提
- this既不指向函式自身也不指向詞法作用域,
- 一旦嘗試this與詞法作用域混用時一定是錯誤的,
- this只在呼叫時才會系結
了解什么是呼叫位置,確定this什么時候系結,
- 呼叫位置就是函式在代碼中被呼叫的 位置(而不是宣告的位置),呼叫位置就在當前正在執行的函式的前一個呼叫中, 它決定了 this 的系結,
- 例如在下圖實體中,在foo函式添加debugger;陳述句,可以看到他的呼叫位置在bar中

- 你可以在javascript除錯工具中給 函式的 第一行代碼設定一個斷點,或者直接在第一行代碼之前插入一條 debugger; 陳述句,運行代碼時,除錯器會在那個位置暫停,同時會展示當前位置的函式 呼叫串列,這就是你的呼叫堆疊,因此,如果你想要分析 this 的系結,使用開 發者工具得到呼叫堆疊,然后找到堆疊中第二個元素,這就是真正的呼叫位置,
- 例如在下圖實體中,在foo函式添加debugger;陳述句,可以看到他的呼叫位置在bar中
系結規則
- 默認系結
- 直接使用不帶任何修飾的函式參考進行呼叫的,因此只能使用 默認系結,無法應用其他規則,
- 例如
function baz() { console.log(this.a); } var a = 1; baz();//1- 如果使用嚴格模式(strict mode),那么全域物件將無法使用默認系結,因此 this 會系結 到 undefined:
- 隱式系結
- 當函式引 用有背景關系物件時,隱式系結規則會把函式呼叫中的 this 系結到這個背景關系物件,因為調 用 foo() 時 this 被系結到 obj,因此 this.a 和 obj.a 是一樣的,
function foo() { console.log(this.a); } var obj = { a: 2, foo: foo }; obj.foo(); // 2 - 顯示系結
- 可以使用 call(..) 和 apply(..) 方法,它們的第一個引數是一個物件,它們會把這個物件系結到 this,接著在呼叫函式時指定這個 this,因為你可以直接指定 this 的系結物件,因此我 們稱之為顯式系結,
- 硬系結
- 使用bind方法,系結后的this無法再修改,
- new系結
- this指向實體
- new的本質
- 創建(或者說構造)一個全新的物件,
- 這個新物件會被執行[[原型]]連接,
- 這個新物件會系結到函式呼叫的this,
- 如果函式沒有回傳其他物件,那么new運算式中的函式呼叫會自動回傳這個新物件,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/221737.html
標籤:JavaScript
上一篇:this系結
