javaScript之this全面解析(2)
在理解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)