猿问

REPL和脚本之间的“此”不同

阅读mozilla文档后,我发现了这一点:


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


在玩了一点示波器之后,我发现在node.js REPL中...


> this === global

true

但是当我用同一行创建脚本时...


$ cat > script.js

console.log(this === global)

$ node script.js

false

是否有一个原因?还是一个错误?


慕斯王
浏览 625回答 3
3回答

肥皂起泡泡

节点REPL是全局的。文件中的代码位于“模块”中,它实际上只是一个函数。您的代码文件变成了如下所示的简化示例:var ctx = {};(function(exports) {    // your code    console.log(this === global);}).call(ctx, ctx);请注意,它是使用来执行的.call(),并且该this值已设置为预定义的对象。

慕容708150

使用节点从文件运行脚本时,它会隐式将其设置为具有自己作用域的模块。当您只运行它而没有文件时,您将进入REPL,但不会进入任何模块范围。

有只小跳蛙

因为this脚本中没有引用模块的作用域(即,模块执行的上下文的变量绑定对象)。例如,var x = 42; console.log(this.x);登录undefined脚本。我没有立即发现任何内容说明this模块中的内容(它记录为空对象),也没有发现REPL使用来评估您的代码this = global。
随时随地看视频慕课网APP
我要回答