REPL和脚本之间的“这个”是不同的

读完mozilla文档后,我发现这个:

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

玩了一段范围后,我发现在node.js REPL …

> this === global true 

但是当我用同一行创build一个脚本…

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

是否有一个原因? 或者是一个错误?

节点的REPL是全局的。 代码从一个文件是在一个“模块”,这实际上只是一个function。

你的代码文件变成这样一个非常简单的例子:

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

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

当您使用节点从文件运行脚本时,它将隐式设置为具有自己范围的模块。

当你只是运行它没有文件,你被放入到REPL中,但不在任何模块范围。