为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕斯王 2019-11-04 11:06:07
阅读mozilla文档后,我发现了这一点:在全局执行上下文中(在任何函数之外),这是指全局对象,无论是否处于严格模式下。在玩了一点示波器之后,我发现在node.js REPL中...> this === globaltrue但是当我用同一行创建脚本时...$ cat > script.jsconsole.log(this === global)$ node script.jsfalse是否有一个原因?还是一个错误?
查看完整描述

3 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

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


您的代码文件变成了如下所示的简化示例:


var ctx = {};

(function(exports) {

    // your code

    console.log(this === global);

}).call(ctx, ctx);

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


查看完整回答
反对 回复 2019-11-04
?
慕容708150

TA贡献1831条经验 获得超4个赞

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

当您只运行它而没有文件时,您将进入REPL,但不会进入任何模块范围。


查看完整回答
反对 回复 2019-11-04
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

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

查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 624 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信