REPL和脚本之间的'this'不同

时间:2013-12-31 17:29:28

标签: javascript node.js this global

阅读mozilla docs后,我发现了这个:

  

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

在播放了一些示波器后,我在node.js中发现了REPL ...

> this === global
true

但是当我创建一个具有相同行的脚本时......

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

这有什么理由吗?或者这是一个错误?

2 个答案:

答案 0 :(得分:10)

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

您的代码文件变成了这个非常简化的示例:

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

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

答案 1 :(得分:0)

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

如果您只是在没有文件的情况下运行它,那么您将被放入REPL但不会放入任何模块范围。