Fe-interview: [js] 第413天 代码中如果遇到未定义的变量,会抛出异常吗?程序还会不会继续往下走?

Created on 1 Jun 2020  ·  5Comments  ·  Source: haizlin/fe-interview

第413天 代码中如果遇到未定义的变量,会抛出异常吗?程序还会不会继续往下走?

3+1官网

我也要出题

js

Most helpful comment

遇到未声明的变量时,程序会报ReferenceError错误,并且会中止代码的执行

console.log(foo);  // Uncaught ReferenceError: foo is not defined

但是如果使用typeof运算符,则不会报错,其常用于判断某个变量是否已定义

console.log(typeof foo);  // undefined

但是如果该变量在该作用域中已定义,但是使用了没有提升(Hoisting)的定义(比如letconst),使用typeof提前访问该变量也会报错:

console.log(typeof foo);  // Uncaught ReferenceError: foo is not defined
let foo = 1;

All 5 comments

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>


  • JS 引擎首先加载第一个<script></script> 代码块,进入解析的三个流程(1、词法语法分析,2、预解析,3、执行阶段),之后在控制台输出 1;
  • 接着 JS 引擎加载第二个<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)的定义(比如letconst),使用typeof提前访问该变量也会报错:

console.log(typeof foo);  // Uncaught ReferenceError: foo is not defined
let foo = 1;
  • 会抛出异常 出现uncaught ReferenceError 变量名:is not defined
  • 停止解析 跳出当前代码块
  • 之前和之后的代码块不会受到影响
  • 根本原因是 JS 是单线程的

严格模式下,不可以给未定义的变量赋值,不可以引用未定义的变量。
非严格模式下,可以给未定义的变量赋值,不可以引用未定义的变量。

Was this page helpful?
0 / 5 - 0 ratings