了解引用同一对象中其他属性的 JavaScript 个对象属性(函数)
Understanding JavaScript object properties (functions) referencing other properties in same object
所以我偶然发现了一个基于 React Hooks 的组件,它使用对象对各种功能进行分类以提高可读性。
例如
const MyComponent = (props) => {
const utilities = {
utility1: () => {
// ...some functionality
},
utility2: () => {
// ...some functionality
},
};
const renderers = {
renderer1: () => {
// ...some rendering logic
},
renderer2: () => {
// ...some rendering logic
return (
<span>{renderers.renderer1()}</span>
);
},
};
return (
// ...rendering logic
);
};
我想了解的是为什么 renderer2
即使调用 renderer1
也能正常工作?
我的理解是对象会在代码执行时被声明,直到所有属性都定义好才声明完成(这只是我的菜鸟理解,我可能完全错了)。
我真的很想知道为什么这段代码能正常工作,尤其是为什么它能正常工作?
另外,附带说明一下,与基于 Class 的组件相比,我觉得基于 Hooks 的组件可读性不是很好,这种方法试图缓解这个问题。 所以我想知道这是否是使基于 Hooks 的组件可读的最佳方法,或者是否有其他更好的方法?
我的理解是对象会在代码执行的时候被声明,直到所有的属性都定义好才声明完成
事实并非如此。变量声明提前发生 - 在编译时,在任何代码实际有机会 运行 之前。不过,对变量的赋值发生在 运行 时间。这包括评估分配的值。
所以在您所说的情况下,当正在评估分配给 renderers
的对象时,实际上已经声明了 renderers
变量。
此外,您还必须考虑这样一个事实,即 renderers.renderer1()
实际上并未作为此对象评估的一部分被调用 - 但仅在稍后实际调用 renderers.renderer2()
时才被调用,此时指向对象评估和分配都将完成,因此 renderers.renderer1()
将是您期望的。
所以我偶然发现了一个基于 React Hooks 的组件,它使用对象对各种功能进行分类以提高可读性。
例如
const MyComponent = (props) => {
const utilities = {
utility1: () => {
// ...some functionality
},
utility2: () => {
// ...some functionality
},
};
const renderers = {
renderer1: () => {
// ...some rendering logic
},
renderer2: () => {
// ...some rendering logic
return (
<span>{renderers.renderer1()}</span>
);
},
};
return (
// ...rendering logic
);
};
我想了解的是为什么 renderer2
即使调用 renderer1
也能正常工作?
我的理解是对象会在代码执行时被声明,直到所有属性都定义好才声明完成(这只是我的菜鸟理解,我可能完全错了)。
我真的很想知道为什么这段代码能正常工作,尤其是为什么它能正常工作?
另外,附带说明一下,与基于 Class 的组件相比,我觉得基于 Hooks 的组件可读性不是很好,这种方法试图缓解这个问题。 所以我想知道这是否是使基于 Hooks 的组件可读的最佳方法,或者是否有其他更好的方法?
我的理解是对象会在代码执行的时候被声明,直到所有的属性都定义好才声明完成
事实并非如此。变量声明提前发生 - 在编译时,在任何代码实际有机会 运行 之前。不过,对变量的赋值发生在 运行 时间。这包括评估分配的值。
所以在您所说的情况下,当正在评估分配给 renderers
的对象时,实际上已经声明了 renderers
变量。
此外,您还必须考虑这样一个事实,即 renderers.renderer1()
实际上并未作为此对象评估的一部分被调用 - 但仅在稍后实际调用 renderers.renderer2()
时才被调用,此时指向对象评估和分配都将完成,因此 renderers.renderer1()
将是您期望的。