本日早上看到民眾號推送了阮一峰先生的文章JavaScript 的 this 道理,文章不是很長因而研討了一下。
看完本身的總結以下:
this
- this 指向函數運轉時地點的環境。
- 函數運轉在對象內,this 就指向該對象
- 運轉在全局環境,this 就指向全局環境
- js 許可函數體內部援用當前環境外的其他變量,因為函數可以在差別運轉環境實行,“當前環境外的其他變量”就是指“差別運轉環境中的變量” ,那末這個時刻就需要有一種機制,可以在函數體內部取得當前的運轉環境,所以 ==
this
== 就應運而生了。
看到 ==js 許可函數體內部援用當前環境外的其他變量== 想到之前本身總結過的關於作用域的知識點:
作用域
- 函數定義的時刻就被肯定了作用域,與它在什麼地方被挪用實行無關
- 當前作用域沒有定義的變量,即自在變量,會到父級作用域中查找,和實行作用域無關;
令我發生疑心的兩句話:
- 函數定義的時刻就被肯定了作用域,和實行作用域無關
- js 許可函數體內部援用當前環境外的其他變量
這裏的 ==實行作用域
== 與下文的 ==當前環境外的其他變量
== 怎樣明白或許做辨別?
翻閱紅寶書(第三版)p73,實行環境是 js 中最為主要的一個觀點,總結以下:
- 函數的運轉環境即其實行環境
- 每一個函數都有本身的實行環境,實行環境定義了函數有權接見的其他數據,保存在變量對象當中。
- 當代碼在一個環境中實行時,會建立變量對象的一個作用域鏈。作用域鏈決議了接見變量對象的遞次。
- this 可以指向差別的運轉環境,這裏的運轉環境本質上指的是對象,可所以內建對象、自定義對象或許全局對象。
- 函數定義時就被肯定了作用域,這個作用域決議了其接見變量對象的遞次。而函數可以在差別環境被實行,這裏的 ==差別環境== (多是外層函數或許全局環境下)的作用域才是實行作用域。
- 所以
實行作用域
可以明白為 函數實行位置外部函數或許全局環境的作用域, 與函數本身的作用域(聲明時就被肯定了) 完全是兩回事 - 當前環境外的其他變量即函數本身作用域外的其他變量
- 函數要想援用 當前環境外的其他變量 只能用 this ,this 指向當前運轉環境,運轉在對象內就指向對象,運轉在全局環境就指向全局對象
- 咦,我本身怎樣也有點亂。。
運轉在全局環境的 this
盡人皆知,瀏覽器環境下 全局環境下的 this 就是 window,沒有一點題目
// 瀏覽器環境下
var a = 'a'
this.b = 'b'
console.log(this.a) // a
console.log(b) // b
console.log(this===window) // true
然則…
// node 環境下
var x = 'xx'
global.y = 'yy'
// node 環境下輸出
console.log(y); // yy global 屬性掛載到了全局環境,
console.log(global.x) // undefined 全局環境中定義的x 變量並沒有掛載到頂層對象global對象中
console.log(this === global) // false
console.log(JSON.stringify(this))// {} 空對象,並非 global
查閱MDN發明:
// node 環境下
function f1() {
return this
}
console.log(f1() === global) // true
console.log(this === global) // false
node 環境下只要定義在函數內部的 this 才指向 global ?
那末, node 環境下 this 究竟指向什麼?經由和導師的溝通
終究發明
// node 環境下
this.num = '10'
global.test = '12'
console.log(module.exports) // {num: "10"}
console.log(this===module.exports) // true
那末 node 環境下 this 為何指向 module.exports
這和模塊化的設想又有什麼關係?
發人深思…
天色已晚,且聽下回分解。