gpt4 book ai didi

javascript - 一个对象什么时候被完全定义?

转载 作者:行者123 更新时间:2023-12-03 04:08:30 25 4
gpt4 key购买 nike

我正在学习 javascript,想在一个对象内定义 2 个类。第二个类是从第一个类派生的。

看起来像:

let foo = {
bar: (function () {
let bar_msg = '';

class bar {
constructor(msg) {
bar_msg = msg;
}
}
return bar;
}()),
baz: (function () {
let baz_msg = '';

class baz extends foo.bar {
constructor(msg) {
super();
baz_msg = msg;
}
}
return baz;
}())
};

错误消息:

Uncaught ReferenceError: foo is not defined

然后,我尝试将类拆分为多个部分:

let foo = {};

foo.bar = (function () {
let bar_msg = '';

class bar {
constructor(msg) {
bar_msg = msg;
}
}
return bar;
}());

foo.baz = (function () {
let baz_msg = '';

class baz extends foo.bar {
constructor(msg) {
super();
baz_msg = msg;
}
msg() {
return baz_msg;
}
}
return baz;
}());

let b = new foo.baz('hi!');
console.log(b.msg());

它有效。

所以,我的问题是:为什么我会得到差异?我无法显示一些 Google 搜索结果,因为我不知道关键字。

最佳答案

当你声明一个对象并为其赋值时,它就被“完全”定义了,如下所示:

var foo = 'bar';

您可以声明一个变量,但不能将其分配给任何值:

var foo;

当你尝试访问它时,它会给你未定义的信息。您还可以为未声明的变量赋值:

foo = 'bar';

JavaScript 会自动创建一个全局变量 foo。如果您尝试访问从未声明或隐式声明的变量(例如 foo = 'bar')。它会抛出一个错误;

console.log(iDoNotExist); // will throw an error!

在您的第一个代码中,类 baz 无法在其自己的作用域中找到 foo,因此它将转到全局作用域。但由于它在全局范围内也不可用,并且既没有显式声明也没有隐式声明,所以它会抛出错误。

在第二个代码中,您显式声明了 foo 并将其分配给一个对象,并在其后面添加了一个属性 bar。声明 foo 之后编写的任何代码都可以访问它,包括将属性 bar 分配给 foo 时,其中一个名为baz 尝试扩展 foo.bar。如果尝试扩展 foofoo.bar 的代码段写在 foo 定义之后。它会抛出一个错误。例如,请参阅下面的代码片段:

class baz extends foo {
constructor(msg) {
super();
baz_msg = msg;
}
msg() {
return baz_msg;
}
}

let foo = {};

let b = new foo.baz('hi!');

总之,您会因为 foo 的可访问性而得到差异。在第一个变量中,您尝试在它既没有显式定义也没有隐式定义之前访问它,从而导致错误。在第二个变量中,您已声明并将其分配给一个值,然后尝试访问它,这是完全合法的。

关于javascript - 一个对象什么时候被完全定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44437316/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com