当我在节点中运行此代码时,函数foo会打印undefined
。但是如果我在Chrome或Firefox控制台中运行相同的代码,我会得到正确的输出(oops, global
)。谁能澄清为什么?
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"
答案 0 :(得分:2)
在浏览器中,全局变量成为window
对象的属性。并且在没有上下文的情况下调用函数时,上下文也默认为window
对象。由于您在未提供上下文的情况下调用foo()
,因此this.a
被视为window.a
,这是全局变量。
Node.js有一个名为global
的全局对象,但全局变量不是该对象的属性。见Does node.js have equivalent to window object in browser。 this.a
被视为global.a
,但这是未定义的,因为变量声明并未分配给它。