Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js和Node.js REPL之间的差异_Javascript_Node.js_Javascript Engine_Node Repl - Fatal编程技术网

Javascript Node.js和Node.js REPL之间的差异

Javascript Node.js和Node.js REPL之间的差异,javascript,node.js,javascript-engine,node-repl,Javascript,Node.js,Javascript Engine,Node Repl,我正在阅读“You don know JS”系列丛书,并尝试运行该片段: function foo() { console.log( this.a ); } function doFoo(fn) { // `fn` is just another reference to `foo` fn(); // <-- call-site! } var obj = { a: 2, foo: foo }; var a = "oops, global"; // `a` als

我正在阅读“You don know JS”系列丛书,并尝试运行该片段:

function foo() {
  console.log( this.a );
}

function doFoo(fn) {
  // `fn` is just another reference to `foo`

  fn(); // <-- call-site!
}

var obj = {
  a: 2,
  foo: foo
};

var a = "oops, global"; // `a` also property on global object

doFoo( obj.foo ); // "oops, global"
正如书中所预期的那样。 Firefox开发控制台上的结果相同

如果我删除声明并只保留赋值
a=“oops,global”
,那么它将在REPL和Node.js上按预期运行。这对我来说更有意义,因为通过这种方式,我在全局对象上设置了一个属性,而通过“原始”方式,我只是声明了一个变量

有人能向我解释一下这种行为吗?谢谢大家

编辑:我想我已经接近解决方案了,我注意到如果我制作一个只包含以下内容的脚本foo.js:

var x = 42;
console.log(this);
我得到了
{}
,因此
x
没有附加到全局对象。如果我启动Node.js REPL并键入相同的代码,我会得到一个附加了
x
的大对象:

{
   ...
   x: 42
}

所以我认为区别在于REPL和Node.js中的“谁是全局对象?”当您在Node.js中运行文件时,您的
var a
实际上不在全局范围内,而是函数范围--一个模块函数范围(更多信息)。基本上,文件的所有内容都像在函数中一样运行。因此,
var a
实际上在该函数范围内


而在REPL中,它确实是在全球范围内

我得出的结论与您的编辑相同,您可能希望将其作为您自己问题的答案发布。如果我坚持,很抱歉,但我会尽力理解:这与使用
Object.prototype馈送Node.js REPL的原因相同吗
数组。原型
使用
{}
[]
进行回复,而使用相同的输入,浏览器引擎(例如Chrome v8)使用
{constructor:ƒ、_uudefinegetter:ƒ、_udefinegetter:ƒ和
进行回复[constructor:ƒ,concat:ƒ,find:ƒ,findIndex:ƒ,pop:ƒ,…]
?感谢您的时间。原因不同(即范围)这与引擎决定如何显示它们有更多关系。
.prototype
是一个有趣的对象,您应该单独阅读。但它基本上共享一些公共属性,如
构造函数
hasOwnProperty
,等等。Chrome显示
{constructor…}
对象的
原型
,以及
数组的
【构造函数…】
。原型
只是它的风格选择。Firefox的显示方式有所不同。Node根本不显示这些内部属性,但如果您按名称指定它们,即
对象。原型。构造函数
,您仍然可以访问它们。
{
   ...
   x: 42
}