为什么节点打印未定义且浏览器没有?

时间:2018-06-16 01:28:57

标签: javascript node.js

当我在节点中运行此代码时,函数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"

1 个答案:

答案 0 :(得分:2)

在浏览器中,全局变量成为window对象的属性。并且在没有上下文的情况下调用函数时,上下文也默认为window对象。由于您在未提供上下文的情况下调用foo(),因此this.a被视为window.a,这是全局变量。

Node.js有一个名为global的全局对象,但全局变量不是该对象的属性。见Does node.js have equivalent to window object in browserthis.a被视为global.a,但这是未定义的,因为变量声明并未分配给它。