js代码在遇到未定义变量时,会抛出ReferenceError异常,由于js单线程执行,所以会造成阻塞。
JS 解析器解析到未定义变量时,会抛出 Uncaught ReferenceError 错误,JS 引擎会停止解析后面的代码,但之前的代码不受影响,并跳出该代码块。
下面看看具体代码。
<!DOCTYPE html>
<html lang="en">
<head>
<title>
第413天 代码中如果遇到未定义的变量,会抛出异常吗?程序还会不会继续往下走
</title>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
</head>
<body>
<script>
console.log(1);
</script>
<script>
console.log(2);
console.log(a);
console.log(3);
</script>
<script>
console.log(4);
</script>
</body>
</html>
<script></script> 代码块,进入解析的三个流程(1、词法语法分析,2、预解析,3、执行阶段),之后在控制台输出 1;<script></script> 代码块,进入解析的三个流程,控制台输出 2,当解析 console.log(a); 这行代码时,因为 a 是未定义的变量,会抛出 Uncaught ReferenceError 错误,JS 引擎会停止解析后面的代码,即 JS 引擎不会执行 console.log(3); 这行代码,并跳出第二个<script></script> 代码块;<script></script> 代码块,进入解析的三个流程,在控制台输出 4。遇到未声明的变量时,程序会报ReferenceError错误,并且会中止代码的执行
console.log(foo); // Uncaught ReferenceError: foo is not defined
但是如果使用typeof运算符,则不会报错,其常用于判断某个变量是否已定义
console.log(typeof foo); // undefined
但是如果该变量在该作用域中已定义,但是使用了没有提升(Hoisting)的定义(比如let、const),使用typeof提前访问该变量也会报错:
console.log(typeof foo); // Uncaught ReferenceError: foo is not defined
let foo = 1;
严格模式下,不可以给未定义的变量赋值,不可以引用未定义的变量。
非严格模式下,可以给未定义的变量赋值,不可以引用未定义的变量。
Most helpful comment
遇到未声明的变量时,程序会报
ReferenceError错误,并且会中止代码的执行但是如果使用
typeof运算符,则不会报错,其常用于判断某个变量是否已定义但是如果该变量在该作用域中已定义,但是使用了没有提升(Hoisting)的定义(比如
let、const),使用typeof提前访问该变量也会报错: