node.js和浏览器

时间:2017-07-29 06:37:46

标签: javascript node.js this

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

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

我的问题是:
1.关于'this'的规则是否与node.js完全相同? 2.任何人都可以解释node.js'this'对象属性或者指向一篇简单的文章。

谢谢!

3 个答案:

答案 0 :(得分:2)

浏览器中的this与node.js没有不同的规则。规则由ECMAScript标准设置,浏览器的Javascript实现和node.js中的规则遵循相同的ECMAScript标准。

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

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

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

obj.method();

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

答案 1 :(得分:1)

this对象是该上下文中global对象的任何对象。在作为process对象的节点中。

答案 2 :(得分:1)

在节点(测试)和浏览器(生产)上运行时,我观察到模块中的 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 优化引起的。