为什么对象引用可以在内部函数成员中访问,但不能在内部 属性 成员中访问?
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
.
例如这失败 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
.