我知道“this”在浏览器上下文中是如何工作的,以及它在不同场景中的值如何变化,例如在使用箭头函数时如何调用函数。
我在节点js的不同场景中打印出“this”(表达js,更具体),它包含更多数据 - 包括路径名等
我的问题是:
1.关于'this'的规则是否与node.js完全相同?
2.任何人都可以解释node.js'this'对象属性或者指向一篇简单的文章。
谢谢!
答案 0 :(得分:2)
浏览器中的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的面向对象特性的一部分。
答案 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
优化引起的。