为什么对象引用可以在内部函数成员中访问,但不能在内部 属性 成员中访问?

Why can an object reference be accessed in inner function members but not in inner property members?

例如这失败 TypeError: Cannot read property 'a' of undefined:

var obj = {
  a: 23,
  b: obj.a,
};

虽然这有效:

var obj = {
  a: 23,
  getA: function() {
    return obj.a;
  }
};

?

奖金问题

那为什么不抛出 ReferenceError:

var obj = {
  a: 23,
  b: obj
};

毕竟obj还不存在呢!如果我试图访问其他地方尚未定义的东西,它会抛出 ReferenceError

您不能访问尚未构造的对象上的对象成员。

在第二个示例中,函数 getA 将在 对象 obj 创建之后被调用 ,因此它是可访问的。

第二个示例中的内容是 闭包。函数内部的变量引用(a.k.a。闭包)指的是变量本身,而不是定义函数时变量的值。

观察:

var a;

function loga() {
  console.log(a);
}

loga(); // undefined

a = 3;

loga(); // 3

a = "hello";

loga(); // hello

您的示例中发生的情况完全相同。你执行函数 after obj 已经有了一个值,所以一切正常。

正如 Felix Kling 指出的那样,在何处声明变量并不重要,只要在范围内 某处 声明即可。这通俗地称为 "variable hoisting".

如果你真的想,你甚至可以这样做:

function loga() {
  console.log(a);
}

var a = 3;

loga(); // 3

So why doesn't this throw a ReferenceError:

var obj = {
  a: 23,
  b: obj
};

after all, obj still doesn't exist yet! It would throw a ReferenceError if I was trying to access a not-yet-defined thing elsewhere!

变量 obj 存在是因为提升。它只是还没有 value。你的例子相当于

var obj; // declaration is hoisted to the top of the scope
obj = {
  a: 23,
  b: obj
};

obj 存在但具有(默认)值 undefined.