【问题标题】:'this' behaves differently in node environment than browser'this' 在节点环境中的行为与浏览器不同
【发布时间】:2019-11-14 03:31:18
【问题描述】:

我正在关注有关thisexecution 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的值应该和浏览器javascript的this值不同,但问题是,为什么myFunc's this的值不等于全局值?

【问题讨论】:

  • 当我在 Node 中运行你的代码时,我得到true,它们是一样的
  • 很有趣,知道为什么它会为我返回false 吗?
  • 我得到了错误 - 所以它可能取决于节点的版本(在 13.x 上为错误)......或者你如何运行它......如果以 repl 运行,我得到真实......并且当'use strict';
  • 我使用的是 v12.13.0。 globalThis 是一个空对象听起来很奇怪,它是从任何东西继承的吗?
  • 使用 var globalThis = global 再次不同

标签: javascript node.js executioncontext


【解决方案1】:

这是因为一个节点模块的全局范围是同一个模块,所以如果你在你的函数之外执行console.log(this)你是在引用一个空模块的全局范围,它是一个空对象{},但是当你在你的函数中执行相同的console.log(this) this 将指向全局节点范围(包含你所看到的:控制台、全局、进程和许多其他东西),现在如果你处于严格模式,函数内部的作用域应该是undefined,因为它没有定义默认的本地作用域。

在全局范围为 Window 对象的浏览器中,它要简单得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-19
    • 2011-02-02
    相关资源
    最近更新 更多