【问题标题】:Differences between Node.js and Node.js REPL [duplicate]Node.js 和 Node.js REPL 之间的差异 [重复]
【发布时间】:2018-04-16 07:38:18
【问题描述】:

我正在阅读《你不懂JS》系列丛书,我尝试运行sn-p:

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"

(您可以在 3d 书籍的第 2 章中找到它:'this' 现在都说得通了

如果我将它保存到 'foo.js' 并使用 node foo.js (v 8.11.1) 运行它,那么我会得到 undefined。而如果我启动节点 REPL 并输入相同的代码,我会得到:

> function foo() { console.log(this.a); }
undefined
> function doFoo(fn) { fn(); }
undefined
> var obj = { a:2, foo:foo };
undefined
> var a = "oops, global";
undefined
> doFoo(obj.foo);
oops, global
undefined

正如书中预期的那样。 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 中。

【问题讨论】:

  • 我得出了与您的编辑相同的结论,您可能希望将其发布为您自己问题的答案。

标签: javascript node.js javascript-engine node-repl


【解决方案1】:

当您在 Node.js 中运行该文件时,您的 var a 实际上并不在全局范围内,而是在函数范围内——一个模块函数范围(更多关于此 here)。基本上,文件的所有内容都像在函数内一样运行。所以var a实际上是在那个函数范围内。

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

【讨论】:

  • 对不起,如果我坚持,但我会尽力理解:这是否与如果用 Object.prototype;Array.prototype 提供 Node.js REPL 他回复 { }[ ] 的原因相同,而使用相同的输入,浏览器引擎(例如 Chrome v8)会回复 {constructor: ƒ, __defineGetter__: ƒ, __defineSetter__: ƒ, hasOwnProperty: ƒ, __lookupGetter__: ƒ, …}[constructor: ƒ, concat: ƒ, find: ƒ, findIndex: ƒ, pop: ƒ, …]感谢您的宝贵时间。
  • 完全不同的原因(即范围)。这更多地与引擎决定如何显示它们有关。 .prototype 是一个有趣的对象,您应该单独阅读。但它基本上具有一些共同的属性,如constructorhasOwnProperty 等。Chrome 显示Object.prototype{constructor ...}Array.prototype[constructor ...] 只是它的风格选择。 Firefox 以不同的方式显示它。 Node 根本不显示这些内部属性,但是如果您按名称指定它们,您仍然可以访问它们,即Object.prototype.constructor
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-21
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2018-07-24
相关资源
最近更新 更多