本文實例形式詳細分析了JavaScript this綁定過程。分享給大家供大家參考,具體如下:
在理解this 的綁定過程之前,首先要理解調用位置:調用位置就是函數在代碼中被調用的位置(而不是聲明的位置)。只有仔細分析調用位置才能回答這個問題:這個this 到底引用的是什么?通常來說,尋找調用位置就是尋找“函數被調用的位置”,但是做起來并沒有這么簡單,因為某些編程模式可能會隱藏真正的調用位置。最重要的是要分析調用棧(就是為了到達當前執行位置所調用的所有函數)。我們關心的調用位置就在當前正在執行的函數的前一個調用中。
下面我們來看看到底什么是調用棧和調用位置:
function baz() {// 當前調用棧是:baz// 因此,當前調用位置是全局作用域console.log( "baz" );bar(); // <-- bar 的調用位置}function bar() {// 當前調用棧是baz -> bar// 因此,當前調用位置在baz 中console.log( "bar" );foo(); // <-- foo 的調用位置}function foo() {// 當前調用棧是baz -> bar -> foo// 因此,當前調用位置在bar 中console.log( "foo" );}baz(); // <-- baz 的調用位置注意我們是如何(從調用棧中)分析出真正的調用位置的,因為它決定了this 的綁定。
你可以把調用棧想象成一個函數調用鏈,就像我們在前面代碼段的注釋中所寫的一樣。但是這種方法非常麻煩并且容易出錯。另一個查看調用棧的方法是使用瀏覽器的調試工具。絕大多數現代桌面瀏覽器都內置了開發者工具,其中包含JavaScript 調試器。就本例來說,你可以在工具中給foo() 函數的第一行代碼設置一個斷點,或者直接在第一行代碼之前插入一條debugger;語句。運行代碼時,調試器會在那個位置暫停,同時會展示當前位置的函數調用列表,這就是你的調用棧。因此,如果你想要分析this 的綁定,使用開發者工具得到調用棧,然后找到棧中第二個元素,這就是真正的調用位置。
綁定規則
我們來看看在函數的執行過程中調用位置如何決定this 的綁定對象。你必須找到調用位置,然后判斷需要應用下面四條規則中的哪一條。
1.默認綁定
首先要介紹的是最常用的函數調用類型:獨立函數調用。可以把這條規則看作是無法應用其他規則時的默認規則。
思考一下下面的代碼:
function foo() {console.log( this.a );}var a = 2;foo(); // 2你應該注意到的第一件事是,聲明在全局作用域中的變量(比如var a = 2)就是全局對象的一個同名屬性。它們本質上就是同一個東西,并不是通過復制得到的,就像一個硬幣的兩面一樣。
接下來我們可以看到當調用foo() 時,
新聞熱點
疑難解答
圖片精選