【发布时间】:2021-11-20 09:54:36
【问题描述】:
在玩一个简单的 Javascript Object Initializer 示例时,我找不到以下代码的解释:
const obj = {
self: this
};
console.log(obj);
会领导Error: Maximum call stack size exceeded吗?
同时,一个略有不同但可能看起来相似的初始化块如下:
const obj = {
self: obj
};
console.log(obj);
将导致Error: Cannot access uninitialized variable.,而以下使用方法初始化程序的示例可以正常工作:
const obj = {
name: 'Bob',
a() {
return obj.name;
},
b() {
return this.name;
},
};
console.log(obj.a());
console.log(obj.b());
您能否详细说明对象初始化过程以及为什么该语言允许在初始化对象及其 this 引用在方法初始化程序中而不是在属性值中使用?
【问题讨论】:
-
First 不适合我,
this也不等于obj,这可能是您的意图。其次,您只是在声明完成之前使用变量,这是不允许的。 -
你只是在声明函数,而不是调用它们,所以它不会抛出。第二个示例是在变量完全初始化之前直接尝试访问
obj。 -
#1 不会导致任何错误,而只会导致意外值,请参阅 stackoverflow.com/questions/4616202/… 。您可以在 JS 中创建循环引用。对象存储在内存中,只有你在 JS 中得到的是一个引用,你甚至可以做到
const arr = []; arr[0] = arr;没有任何问题。 -
@Teemu 你确定全局
this是未定义的行为吗?我一直看到this === globalThis -
@Newbie 我没有说 global
this是未定义的,我说它可能是意想不到的值,当您期望它引用obj时(在 OP 的示例中)。
标签: javascript reference this object-initializers