綁定規(guī)則:
- 默認(rèn)綁定
- 隱式綁定
- 顯示綁定
- new綁定
判斷this
現(xiàn)在我們可以根據(jù)優(yōu)先級(jí)來(lái)判斷函數(shù)在某個(gè)調(diào)用位置應(yīng)用的是哪條規(guī)則。 可以按照下面的順序來(lái)進(jìn)行判斷:
- 函數(shù)是否在 new 中調(diào)用( new 綁定) ? 如果是的話 this 綁定的是新創(chuàng)建的對(duì)象。
var bar = new foo() - 函數(shù)是否通過(guò) call、 apply( 顯式綁定) 或者硬綁定調(diào)用? 如果是的話, this 綁定的是
指定的對(duì)象。
var bar = foo.call(obj2) - 函數(shù)是否在某個(gè)上下文對(duì)象中調(diào)用( 隱式綁定) ? 如果是的話, this 綁定的是那個(gè)上
下文對(duì)象。
var bar = obj1.foo() - 如果都不是的話, 使用默認(rèn)綁定。 如果在嚴(yán)格模式'use strict'下, 就綁定到 undefined, 否則綁定到
全局對(duì)象。
var bar = foo()
綁定例外
一定要注意, 有些調(diào)用可能在無(wú)意中使用默認(rèn)綁定規(guī)則。 如果想“ 更安全” 地忽略 this 綁定, 你可以使用一個(gè) DMZ 對(duì)象, 比如 ? = Object.create(null), 以保護(hù)全局對(duì)象。
ES6 中的箭頭函數(shù)并不會(huì)使用四條標(biāo)準(zhǔn)的綁定規(guī)則, 而是根據(jù)當(dāng)前的詞法作用域來(lái)決定this, 具體來(lái)說(shuō), 箭頭函數(shù)會(huì)繼承外層函數(shù)調(diào)用的 this 綁定( 無(wú)論 this 綁定到什么)。 這其實(shí)和 ES6 之前代碼中的 self = this 機(jī)制一樣。