【问题标题】:difference between function context (this) in node.js and browsernode.js 和浏览器中的函数上下文(this)之间的区别
【发布时间】:2017-07-29 06:37:45
【问题描述】:

我知道“this”在浏览器上下文中是如何工作的,以及它的值在不同场景中如何变化,例如在使用箭头函数时如何调用函数。

我在 node js 的不同场景中打印出“this”(表达 js,更具体地说),它包含更多数据 - 包括路径名等

我的问题是:
1.关于'this'的规则对于node.js是否完全相同?
2. 谁能解释一下node.js 'this' 对象的属性或者给我一个简单的文章。

谢谢!

【问题讨论】:

  • 是的。 NodeJS 只是 JavaScript 的运行时,所有 JavaScript 的规则都适用完全相同...
  • “谁能解释一下 node.js 'this' 对象的属性,或者给我指出一篇简单的文章。” 我不想这么说,但这意味着“可以有人帮我写谷歌并写一个摘要吗?”

标签: javascript node.js this


【解决方案1】:

this 在浏览器和 node.js 中没有不同的规则。这些规则由 ECMAScript 标准制定,浏览器的 Javascript 实现和 node.js 中的实现都遵循相同的 ECMAScript 标准。

您可能看到的是this 在某些特定上下文中的“默认”值。在浏览器中,您可能正在查看this 的默认值,它可能是window 对象。在 node.js 中,如果您看到文件名,您可能会将模块句柄视为 this 或 global 对象的默认值。

为了更具体地帮助您,我们需要查看您在每个环境中检查 this 值的代码,并了解您是否在严格模式下运行。

在大多数情况下,this 不仅仅与默认值一起使用,而是与 this 值设置为的特定对象一起使用。例如,如果您正在调用类似:

obj.method();

然后,在method 的实现中,Javascript 解释器会将this 的值设置为obj。这是 Javascript 面向对象特性的一部分。

【讨论】:

    【解决方案2】:

    这个this 对象就是那个上下文中的global 对象。在 process 对象的节点中。

    【讨论】:

    • 也许你的意思是global object
    【解决方案3】:

    我观察到this 在节点(测试)和浏览器(生产)上运行时模块中的区别。

    在测试中:

    以下类型的代码在通过测试运行时运行良好:

    export function A()
    {
    }
    
    export function B()
    {
      // NOTE: DON'T DO THIS. prepending "this." is not needed and might break.
      this.A();
    }
    

    但在生产中它会抛出:

    TypeError: Cannot read property 'A' of undefined
    

    然而,这不是节点 + 浏览器/webview 之间的区别,而是生产代码(通过 webpack v4 的 bundle.js 生产构建)和测试中运行的代码之间的区别。

    使用 bundle.js 的调试版本 this 将指向模块(因此包含导出模块符号的对象) 例如:

    {
      A : [Function: A]
      B : [Function: B]
    }
    

    而在 bundle.js 的发布版本中 this 返回 undefined

    这种行为差异是由 webpacks concatenateModules 优化造成的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-23
      • 2011-07-31
      • 2018-04-28
      • 2011-09-07
      • 1970-01-01
      相关资源
      最近更新 更多