【发布时间】:2019-12-21 11:35:22
【问题描述】:
当我们编写类似下面 sn-p JavaScript 的代码时,不要编译这段代码并返回 Uncaught SyntaxError: Identifier 'variableName' has already been declared 而且我们看不到“Hello World”控制台
function functionName() {
console.log("Hello World");
}
functionName();
let variableName = "Murad";
let variableName = "Tofiq";
但是当我们编写像下面的sn-p这样的代码时,代码被编译但在执行时返回错误,我们在控制台中看到“Hello World”。
function functionName() {
console.log("Hello World");
}
functionName();
console.log(variableName);
let variableName = "Tofiq";
我的问题是 JavaScript 编译器知道我们声明变量的语义分析时间让这个是创建 TDZ(临时死区)并且此代码返回错误。但是为什么这段代码会编译?这是bug吗?
【问题讨论】:
-
JavaScript 编译整个脚本,而不是顺序编译。
-
@Barmar 我理解不能按顺序编译。但是编译器可以在初始化之前看到“语义错误”这个变量的使用时间,并且可以停止编译返回错误。像第一个代码示例
-
不,这只是在我们用 VAR 声明变量时发生的。如果你想在初始化之前访问用 LET 声明的变量,这是返回错误。未捕获的 ReferenceError:在初始化之前无法访问“variableName”
-
解析时检测到语法错误,运行时检测到引用错误。
-
但是为什么第一个例子返回错误?这也是语义错误。
标签: javascript v8 jit