【发布时间】: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