2.2 .this的绑定规则
2.this的綁定規則
1.默認綁定
1 function foo( ) 2 { 3 console.log(this.a); 4 } 5 var a=1; 6 foo(); //1在代碼中,foo()函數不帶任何修飾的引用進行調用的,那么只能使用默認綁定。
2.隱式綁定
1 function foo1() 2 { 3 console.log( this.a ); 4 } 5 var obj = { 6 a: 1, 7 foo: foo1 8 }; 9 obj.foo(); //1
調用位置使用obj上下文來引用函數foo2,故可以說函數被調用時obj對象“擁有”或“包含”該函數foo2()。
那么foo2函數被調用時,確實加上了對obj的引用。當函數引用有上下文對象時,
隱式綁定規則會把函數調用中的this綁定到這個上下文對象。
故上文中的this.a等同于obj.a。
PS1:對象屬性引用鏈中只有上一層或者最后一層在調用位置中起作用。
距離this最近的對象上下文時obj2,故this.a等同與obj2.a,同時等同于obj1.obj2.a。
PS2:隱式丟失
這里的要點就是關注var bar=obj3.foo;
雖然bar只是obj3.foo的一個引用,但bar實際引用的時foo3()函數本身。
因此此時的bar()其實是一個不帶任何修飾的函數調用,所以應用默認綁定。
PS2:隱式丟失(發生在函數調用時)。
參數傳遞其實就是一個隱式賦值,故傳入函數也會被隱式賦值。
所以結果與上面例子一致。
同理,這里傳入的是自定義函數。即使傳入的是內置函數,結果也是一樣的。
PS3:如上所見,回調函數丟失this綁定是很常見的。
與此同時,另一種丟失情況更加出人意料:調用回調函數可能會修改this。
在一些流行的js庫中,事件處理器經常會把回調函數的this綁定到DOM元素上。
3.顯式綁定
顯式綁定,即是通過call,apply等方法來強制綁定。
call與apply的第一個參數都是thisObj,表示this的指向。第二個參數,call是輸入單個參數,apply是輸入參數數組。多個參數時,后者性能更優。
通過foo.call(),可以在調用foo時強制把它的this綁定到obj上。
PS1:“裝箱”
如果thisObj參數傳入的是一個原始值(簡單數據類型),這個原始值會被轉換成它的對象形式(如new String(..),new Boolean(..),或者new Number(..))。這通常稱為“裝箱”。
PS2:解決之前提出的丟失綁定問題。
1.硬綁定(顯式綁定的一個變種)
硬綁定的典型應用場景就是創建一個包裹函數,負責接收參數并返回值;
另一個使用方法就是創建一個可以重復應用的輔助函數:
由于硬綁定是一個非常常用的模式,故ES5提供了一個內置方法bind,和上述用法類似。
bind(..)會返回一個硬編碼的新函數(切記,新函數),這會將指定的參數設置為this的上下文并調用原始函數。
2.API調用的“上下文”
第三方庫的許多函數,以及JS語言和宿主環境(如瀏覽器環境)中許多內置函數,都提供了一個可選參數,通常稱為“上下文(context)。
其作用與bind(..)類似,確?;卣{函數使用指定的this。
?
4.new綁定
在此先糾正js中new與其他語言中new的區別。
在其它面向類語言中,”構造函數“是類中的一些特殊方法,使用new 初始化類時調用類中的構造函數。
在JS中,構造函數只是一些使用new操作符時被調用的函數。它們不屬于某個類,也不會實例化一個類。
JS中使用new來調用函數,或者說發生構造函數調用時,會自動執行以下操作。
1.創建(或者說構造)一個全新的對象。
2.這個新對象會被執行[[Prototype]]鏈接。
3.這個新對象會綁定到函數調用的this。
4.如果函數沒有返回其他對象,那么new表達式中的函數調用會自動返回這個新對象。
?
更多專業前端知識,請上 【猿2048】www.mk2048.com
總結
以上是生活随笔為你收集整理的2.2 .this的绑定规则的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 实时监听input输入框value的变化
- 下一篇: 4. HTML表单标签