Javascript ';这';REPL和script之间的不同

Javascript ';这';REPL和script之间的不同,javascript,node.js,this,global,Javascript,Node.js,This,Global,通读之后,我发现: 在全局执行上下文中(在任何函数之外),这是指全局对象,无论是否处于严格模式 在玩了一点作用域之后,我发现在node.js REPL > this === global true 但是当我用同一行创建脚本时 $ cat > script.js console.log(this === global) $ node script.js false 这有什么原因吗?还是一个bug?当您使用node从文件运行脚本时,它会隐式地将其设置为具有自己作用域的模块 当您在没有

通读之后,我发现:

在全局执行上下文中(在任何函数之外),这是指全局对象,无论是否处于严格模式

在玩了一点作用域之后,我发现在node.js REPL

> this === global
true
但是当我用同一行创建脚本时

$ cat > script.js
console.log(this === global)
$ node script.js
false

这有什么原因吗?还是一个bug?

当您使用node从文件运行脚本时,它会隐式地将其设置为具有自己作用域的模块


当您在没有文件的情况下运行它时,您将被放入REPL中,但不在任何模块作用域中。

节点的
REPL
是全局的。文件中的代码位于“模块”中,这实际上只是一个函数

您的代码文件将变成如下非常简化的示例:

var ctx = {};
(function(exports) {
    // your code
    console.log(this === global);
}).call(ctx, ctx);

请注意,它是使用
.call()
执行的,并且
this
值被设置为预定义对象。

没错,但它没有解释
this
,因为脚本中的
this
没有引用模块的范围(即模块执行上下文的变量绑定对象). 例如,
var x=42;console.log(this.x)在脚本中记录
未定义的
。我没有立即发现任何东西说明模块中的
this
是什么(它作为一个空对象记录),或者任何东西说明REPL使用
this=global
@T.J.Crowder对代码进行求值。是的,我在这一点上是一个新手,所以我不确定Node在做什么。我从来没有想过尝试通过
这个
访问范围,但这当然就是为什么会存在堆栈溢出问题:)@T.J.Crowder但是从运行
节点
得到的简单回复来看,它确实看起来像
这个
是全局的,如果你尝试
var
测试它也会:
var foo=“hello world”;global.foo;
打印正确的值。是的,REPL肯定是用
this=global
执行代码。事实上,
console.log(this==exports);
logs
true
。很有趣。我不认为“节点REPL”是全局的“真正回答了为什么REPL调用您用
this=global
输入的代码,但这很好地解释了模块中的
this
。这在文档中的某个地方吗?好的,这当然有意义。@T.J.Crowder:我不知道是否有文档记录。我通过阅读资料了解了它的工作原理。这也是Node创建
require()
幂等元的方法。
ctx
对象被缓存,并在后续调用中返回。“
REPL
是全局的”,我的意思是提供的代码在全局范围内执行,因此它的
this
是全局对象,无论我们是否处于严格模式,如MDN引用所述。@cookiemonster::-)节点的文档仍然,几年后,留下很多不满意的地方。啊,好吧。。。也许有一天我会对Node有足够的了解来帮助改善这种情况,尽管回去记录别人的东西总是让我感到厌烦。