Javascript ';这';REPL和script之间的不同
通读之后,我发现: 在全局执行上下文中(在任何函数之外),这是指全局对象,无论是否处于严格模式 在玩了一点作用域之后,我发现在node.js REPLJavascript ';这';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从文件运行脚本时,它会隐式地将其设置为具有自己作用域的模块 当您在没有
> 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);
logstrue
。很有趣。我不认为“节点REPL”是全局的“真正回答了为什么REPL调用您用this=global
输入的代码,但这很好地解释了模块中的this
。这在文档中的某个地方吗?好的,这当然有意义。@T.J.Crowder:我不知道是否有文档记录。我通过阅读资料了解了它的工作原理。这也是Node创建require()
幂等元的方法。ctx
对象被缓存,并在后续调用中返回。“REPL
是全局的”,我的意思是提供的代码在全局范围内执行,因此它的this
是全局对象,无论我们是否处于严格模式,如MDN引用所述。@cookiemonster::-)节点的文档仍然,几年后,留下很多不满意的地方。啊,好吧。。。也许有一天我会对Node有足够的了解来帮助改善这种情况,尽管回去记录别人的东西总是让我感到厌烦。