“This” in nodeJS
以下討論 nodeJS 中的 this,與 javascript 中的 this 不同,請不要搞混了。
function 外的 this
function 外的 this 指向 module.exports
1 | console.log('outside: ', this) // {} |
1 | module.exports.bar = 3 |
切記!這個 this 並不是 global
function 中的 this
function 中的 this 才是指向 global
1 | function foo(argument) { |
output:
1 | Object [global] { |
如果我們確定 function 中的 this 指向 global,那麼可以透過以下例子在 global 新增屬性
1 | function foo(argument) { |
物件中的 this
再來,我們要討論物件中的 this,這邊就跟其他程式語言較為類似,物件中的 this 指向物件本身。
1 | class Foo { |
arrow function 中的 this
1 | let obj = { |
要注意的是 arrow function 不會有自己的空間,即使在物件中也是。
這邊 arrow function 的 this 指向的是 module.exports
(相同於 function 外的 this)
為何這麼複雜?
為什麼 nodeJS 的 this 要這樣設計?
其實跟作用域有關,在 nodeJS 中,每一個份 js 檔案都是一份 module。然而這樣的設計有利於區隔不同 module 之間的命名空間。
我們在 A 檔案下的 global 屬性,只要 B 引入 A 模組,就可以直接使用 A 檔案的 global 屬性。
A.js
1 | global.bar = 3 |
B.js
1 | require('./A') |
由以上例子又可以知道,其實我們原本直接使用的那些 function,通通都在 global 之中
1 | console.log(global.console.log === console.log) // true |