1. 程式人生 > >javaScript之this全面解析(2)

javaScript之this全面解析(2)

mode undefined fin 全局對象 bar def rip 布爾 defined

在理解this的綁定過程之前,我們先來理解調用位置(不是聲明位置) ,最重要的是要分析調用棧(就是為了到達當前執行位置所調用的所有函數)。

我們關心的調用位置就在當前正在執行的函數的前一個調用中,例:

技術分享

好了,調用位置我們已經找到了,然後我們來看看this綁定的四大規則

第一個規則:默認綁定(獨立函數調用),可以把這條規則看做是無法應用其他規則時的默認規則,看代碼

技術分享

代碼中foo()是直接使用不帶有任何修飾的函數引用進行調用的,因此只能使用默認綁定,無法應用其他規則。如果使用嚴格模式(strict mode),

則不能將全局對象用於默認綁定,因此this會綁定到undefined。

技術分享

第二個規則:隱式綁定

看代碼

技術分享

當函數引用有上下文對象時,隱式綁定規則會把函數調用的this綁定到這個上下文對象,因為調用foo時

this被綁定到obj,因此this.a和obj.a是一樣的。對象屬性引用鏈中只有上一層或者說最後一層在調用位置起作用

如:

技術分享

隱式丟失:看代碼

技術分享

雖然bar是obj.foo的一個引用,但是實際上,它引用的是foo函數本身,因此此時的bar()其實是一個不帶任何修飾的函數調用,因此應用了默認綁定。

技術分享

參數傳遞其實就是一種隱式賦值,所以結果和上面結果一樣

如果把函數傳入語言內置的函數而不是傳入你聲明的函數,結果是一樣的,沒有區別

技術分享

第三個規則:顯示綁定

說到這裏就不得不說call和apply函數了,那麽他們是如何工作的呢?

他們的第一個參數是一個對象,是給this準備的,接著在調用函數時將其綁定到this。因為你可以直接指定this的綁定對象,因此稱之為顯示綁定

看代碼:

技術分享

如果你傳入了一個原始值(字符串類型、布爾類型或者數字類型)來當做this的綁定對象,這個原始值會被轉換成他的

對象形式(也就是new String(...)、new Boolean(...)或者new Number(...))。這通常被稱為裝箱。

硬綁定:方法1

技術分享

方法2

技術分享

由於硬綁定是一種非常常用的模式,所以es5提供了內置的方法function.prototype.bind,用法如下

技術分享

規則四:new綁定

使用 new來調用函數,會自動執行以下操作:

1、創建一個全新的對象

2、這個新對象會被執行[[prototype]]連接

3、這個新對象會綁定到函數調用的this

4、如果函數沒有返回其他對象,那麽new表達式中的函數調用會自動返回這個新對象

看以下代碼,new this綁定

技術分享

javaScript之this全面解析(2)