Javascript 一个对象怎么可能有一个属性,但对它的访问会导致ReferenceError?
如果Javascript 一个对象怎么可能有一个属性,但对它的访问会导致ReferenceError?,javascript,node.js,Javascript,Node.js,如果a.js是我们应用程序的入口点,那么b.js将首先运行。在这个阶段,从b.js调用console.log(aModule)会导致这样的输出: // a.js import * as bModule from './b.js' export const b = bModule // b.js import * as aModule from './a.js' export const a = aModule [模块]{ 乙:,, } 如果b.js尝试访问aModule.b它将以引用错误结
a.js
是我们应用程序的入口点,那么b.js
将首先运行。在这个阶段,从b.js
调用console.log(aModule)
会导致这样的输出:
// a.js
import * as bModule from './b.js'
export const b = bModule
// b.js
import * as aModule from './a.js'
export const a = aModule
[模块]{
乙:,,
}
如果b.js
尝试访问aModule.b
它将以引用错误结束:b未定义
ReferenceError
在代码使用尚未声明的标识符(变量)时引发。但是,在这种情况下,aModule
确实具有属性b
(事实由console.log
证实)。此外,当我们访问一个未初始化的对象属性时,我们只得到未定义的
值,而不是异常
那么如何理解这种行为呢?是否指定了它?此行为是由于
与使用var
声明的标识符不同,使用let
或const
声明的标识符被标记为“尚未初始化”,在javascript代码的逐步执行过程中实际执行其声明之前,无法访问这些标识符
由于a.js
中的b
是用const
定义的,因此它被提升,但在其声明实际执行之前,您无法访问它。如果用let
声明b
,情况也是如此
如果使用var
声明b
,则会将未定义的作为输出。此行为是由于
与使用var
声明的标识符不同,使用let
或const
声明的标识符被标记为“尚未初始化”,在javascript代码的逐步执行过程中实际执行其声明之前,无法访问这些标识符
由于a.js
中的b
是用const
定义的,因此它被提升,但在其声明实际执行之前,您无法访问它。如果用let
声明b
,情况也是如此
如果使用var
声明b
,则会看到undefined
作为输出
当代码使用尚未声明的标识符(变量)时,将引发ReferenceError
不仅如此。:-)
此外,当我们访问未初始化的对象属性时,我们只得到未定义的值,而不是异常
是的,但模块是现代结构,您正在使用另一种现代结构:let
。它被定义为在初始化之前使用失败,而不是提供不明确的值
是的,这是特定的行为。模块经历了一系列阶段,在此过程中,let
、const
或class
绑定的导出被创建为未初始化的绑定,然后使用值初始化这些导出。当模块具有循环(循环依赖项)时,可能会在初始化导出之前看到导出,从而导致ReferenceError
这与我们在这里看到的时间死区(TDZ)相同:
设a=21;
console.log(a);//21
如果(真){
console.log(a);//ReferenceError
设a=42;
}
当代码使用尚未声明的标识符(变量)时,将引发ReferenceError
不仅如此。:-)
此外,当我们访问未初始化的对象属性时,我们只得到未定义的值,而不是异常
是的,但模块是现代结构,您正在使用另一种现代结构:let
。它被定义为在初始化之前使用失败,而不是提供不明确的值
是的,这是特定的行为。模块经历了一系列阶段,在此过程中,let
、const
或class
绑定的导出被创建为未初始化的绑定,然后使用值初始化这些导出。当模块具有循环(循环依赖项)时,可能会在初始化导出之前看到导出,从而导致ReferenceError
这与我们在这里看到的时间死区(TDZ)相同:
设a=21;
console.log(a);//21
如果(真){
console.log(a);//ReferenceError
设a=42;
}
FWIW,我在新书《JavaScript:新玩具》(JavaScript:New Toys)第13章中探讨了模块的力学,包括TDZ和循环(TDZ与let
、const
和类的关系在第2章和第4章中)。如果您感兴趣,请访问我的个人资料中的链接。FWIW,我将在我的新书《JavaScript:New Toys》(JavaScript:the New Toys)第13章中探讨模块的机制,包括TDZ和循环(TDZ与let
、const
、以及class
的关系在第2章和第4章中)。如果您感兴趣,请在我的个人资料中添加链接。
[Module] {
b: <uninitialized>,
}