淺談this的四種綁定方式

再一次進行對this知識點的復習,每一次都是溫故知新的過程。
這次對于this的學習基于《你所不知道的JavaScript》這本書,算是對于書中的知識做一個總結。

首先要明確的是一般情況下,this不是函數(shù)被定義時綁定,而是函數(shù)被調用時被綁定

那么函數(shù)中的this有四種綁定方式:

1. 默認綁定
直接調用函數(shù),使用不帶任何修飾的函數(shù)進行調用,只能使用默認綁定,無法應用其它規(guī)則,代碼如下:
function foo() {
  console.log(this.a);
}
var a = 1;
foo() // 1
2. 隱式綁定
函數(shù)被調用時有上下文對象,那么this會綁定這個上下文對象,代碼如下:
function foo() {
  console.log(this.a);
}
var obj = {
  a: 2,
  foo: foo
}
var a = 1;
obj.foo() // 2

其實不能講foo這個函數(shù)屬于obj對象,但是foo函數(shù)被調用時的落腳點的確是指向obj對象,當函數(shù)引用有上下文對象時,隱式綁定就會把函數(shù)調用中的this綁定到這個上下文對象;

對象屬性引用鏈中只有最頂層或者說最后一層會影響調用位置

var foo = function () {
  console.log(this.a)
}
var obj2 = {
  a: 2
  foo: foo
}
var obj1 = {
  a: 1
  obj2: obj2
}
obj1.obj2.foo() // 2
隱式丟失

對于應用隱式綁定方式綁定this經常導致的一個情況是隱式丟失this

function foo() {
  console.log(this.a);
}
var obj = {
  a: 2,
  foo: foo
}
var bar = obj.foo;
var a = 'global';
bar() // 'global'

針對這種情況,雖然bar是obj.foo的一個引用,但是實際上它引用的是foo函數(shù)本身,此時bar()其實是一個不帶任何修飾的函數(shù)調用,應用了默認綁定;

3. 硬綁定
使用call,apply或者bind,在調用函數(shù)的時候直接指定上下文對象,那么函數(shù)中的this會綁定到傳入的對象,代碼如下:
function foo() {
  console.log(this.a);
}
var obj = {
  a: 1
}
foo.apply(obj) // 1
4. new綁定
使用new調用某個構造函數(shù),代碼如下:
function Foo(a) {
  this.a = a;
  console.log(this.a);
}
var obj = new Foo(2);
console.log(obj.a) // 2
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • this 的四種綁定策略( 默認綁定、隱式綁定、顯式綁定、new 綁定 ) 默認綁定:this 一般默認指向全局作...
    南航閱讀 1,931評論 0 0
  • this是一個關鍵字,不是變量,也不是屬性名,JavaScript的語法不允許給this賦值。和變量不同,關鍵字t...
    小妍妍說閱讀 968評論 2 3
  • 最近在看《你不知道的JavaScript(上卷)》,覺得書中關于this的知識點講解的比較透徹易懂,在此做一些整理...
    jeff_nz閱讀 676評論 0 0
  • 去年有一個詞,讓我充滿了幻想,叫“財富自由”,意思就是你不用再為生活,為房貸,為車貸,為下一代而出賣自己的時間了,...
    招財忍者貓閱讀 136評論 0 0
  • 每個人學習13月亮歷法都有屬于他的獨特方式,而我的其中一個方式就是用我比較喜歡的手作結合在這場學習中。根據當日的星...
    阿B_欣閱讀 262評論 0 0

友情鏈接更多精彩內容