'this' 在节点环境中的行为不同于浏览器
'this' behaves differently in node environment than browser
我正在关注有关 this
和 execution context 的教程。我观察到此代码在 Chrome 控制台中正确执行:
var globalThis = this
function myFunc () {
console.log('globalThis: ', globalThis)
console.log('this inside: ', this)
console.log(globalThis === this)
}
myFunc()
// globalThis: Window {...}
// this inside: Window {...}
// true
但是,当我尝试在节点环境中执行相同的代码时,我收到以下响应:
globalThis: {}
this inside: { console: [Getter],
global: [Circular],
process:
process {
title: 'node',
version: 'v8.16.2',
...
false
我理解全局节点this
的值应该和浏览器的javascriptthis
的值不一样,但是问题是,为什么myFunc's this
的值不相等全局值?
这是因为节点模块的全局作用域是同一个模块,所以如果你在你的函数之外执行 console.log(this)
你引用的是一个空模块的全局作用域,它是一个空对象 {}
,但是当你在函数中执行相同的 console.log(this)
时,this
将指向全局节点范围(包含你所看到的:控制台、全局、进程和许多其他内容) ,现在如果你在严格模式下,你的函数内部的范围应该是 undefined
因为它没有定义默认的本地范围。
在全局范围是 Window
对象的浏览器上要简单得多。
我正在关注有关 this
和 execution context 的教程。我观察到此代码在 Chrome 控制台中正确执行:
var globalThis = this
function myFunc () {
console.log('globalThis: ', globalThis)
console.log('this inside: ', this)
console.log(globalThis === this)
}
myFunc()
// globalThis: Window {...}
// this inside: Window {...}
// true
但是,当我尝试在节点环境中执行相同的代码时,我收到以下响应:
globalThis: {}
this inside: { console: [Getter],
global: [Circular],
process:
process {
title: 'node',
version: 'v8.16.2',
...
false
我理解全局节点this
的值应该和浏览器的javascriptthis
的值不一样,但是问题是,为什么myFunc's this
的值不相等全局值?
这是因为节点模块的全局作用域是同一个模块,所以如果你在你的函数之外执行 console.log(this)
你引用的是一个空模块的全局作用域,它是一个空对象 {}
,但是当你在函数中执行相同的 console.log(this)
时,this
将指向全局节点范围(包含你所看到的:控制台、全局、进程和许多其他内容) ,现在如果你在严格模式下,你的函数内部的范围应该是 undefined
因为它没有定义默认的本地范围。
在全局范围是 Window
对象的浏览器上要简单得多。