JavaScript真正的this指向原理

JavaScript函數是一個單獨的值,它能夠在不一樣的環境(上下文)中執行,同時JavaScript 容許在函數體內部,引用當前環境的其餘變量。數據結構

爲了可以在函數體內部得到當前的運行環境(context)。因此,this就出現了,它的設計目的就是在函數體內部,指代函數當前的運行環境。函數

在JavaScript語言中,this的設計跟內存的數據結構有關。基本數據類型是按值訪問的,引用類型存儲在內存中。this

好比:設計

var outer={
   fn:function(){console.log(this.x)},
   x:2
 }
 var x=1;
 var runFn=outer.fn;
 
 outer.fn() //2
 runFn() //1

上面的代碼中,將一個對象賦值給變量outer,JavaScript引擎會先在內存中生成對象{fu:function(){},x:2},而後把對象的內存地址賦值給變量outer。code

也就是說,變量outer 保存的是一個地址。後面若是要讀取outer.fn,引擎先從outer拿到內存地址,而後再從該地址讀出原始的對象。對象

而後原始對象根據fn屬性值,然而fn的屬性值是一個函數,這時JavaScript引擎將函數單獨保存在內存中,而後將函數的內存地址賦值給fn屬性的 value 屬性。ip

而後獲取函數的地址內存地址,outer.fn()函數運行後,其函數內部上下文(context)指向的就是原始對象環境,即his指向outer,返回outer的x屬性值。內存

outer.fn()是經過outer找到fn,因此就是在outer環境執行。一旦var runFn = outer.fn,變量runFn就直接指向函數自己,因此runFn()就變成在全局環境執行。io

相關文章
相關標籤/搜索