一、JavaScript——this原理,內存的數據結構

問題:為什么函數中的this指向調用這個函數的對象?

var obj = {
  a:'obj里的ccc',
  b:function(){
    console.log(this.a)
  }
}

// 1.obj調用b函數
obj.b()
// obj里的ccc

// 2.window 調用b函數
var a = 'window下的ccc'
var c = obj.b  
c()
// window下的ccc

為什么執行的結果會有如此的差異呢

為什么obj.b()obj調用了函數

為什么c()window調用了函數

為什么函數內的this,指向調用這個函數的對象(環境)呢

解釋:

var a = {haha:'hehe'}
  • 一個對象{haha:'hehe'}賦值給了 變量a

  • js會在內存中,生成一個對象{haha:'hehe'}

  • 然后把這個對象在內存里的地址給到變量a

  • 所以a拿到的只是一個地址

var obj = {
  a: function(){}
}
  • 同理obj拿到的是{a: function(){}}對象在內存里的地址

  • {a: function(){}}對象在內存中的a變量也只是function(){}在內存中另外的一個地址

  • 由于函數是一個單獨的值(value)

  • 所以函數可以在不同的環境(對象)執行

  • this也指向了不同的環境


所以 問題中的obj.ac存放的是同一個函數在內存中的地址----a、c變量中存的都只是地址

所以 obj.a()c() 是同一個函數,在不同環境中執行

那么this就指向不同的環境

總結:

所以才有,那么那么多的,函數中的this,是指向調用該函數的環境(對象),這樣一些類似的概念


GitHub

《web_knowledge_hierarchy》

參考文章

阮一峰——《JavaScript 的 this 原理》

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。