Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 一个对象怎么可能有一个属性,但对它的访问会导致ReferenceError?_Javascript_Node.js - Fatal编程技术网

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>,
}