JS预解析/编译(变量提升):var(仅声明,无赋值)、function变量 创建作用域

目录

let、const 、class的暂时性死区

顶级作用域和函数作用域:let 不会在全局对象上创建属性

let不允许重复声明

*编译

分词/词法分析:分解(var a=2=> var,a,=,2)

解析/语法分析:词法数组=>程序语法 结构的“抽象语法树”(a->2)(Abstract Syntax Tree,AST)

代码生成:将 AST 转换为可执行代码

调用函数的对象


letconst 、class的

“暂时性”区:这个区域取决于代码执行的时间点,而不是代码编写的顺序。

{
  // 暂时性死区始于作用域开头
  const func = () => console.log(letVar); // 没问题

  // 在暂时性死区内访问 letVar 会抛出 `ReferenceError`

  let letVar = 3; // 暂时性死区结束(对 letVar 而言)
  func(); // 在暂时性死区外调用
}

用 letconst 或 class 声明的变量可以称其从代码块的开始一直到代码执行到变量声明的位置并被初始化前,都处于一个“暂时性死区”(Temporal dead zone,TDZ)中。

当变量处于暂时性死区之中时,其尚未被初始化,并且任何访问其的尝试都将导致抛出 ReferenceError

当代码执行到变量被声明的位置时,变量会被初始化为一个值。如果变量声明中未指定初始值,则变量将被初始化为 undefined

这与 var 声明的变量不同,如果在声明位置前访问 var 声明的变量会返回 undefined

{
  // 暂时性死区始于作用域开头
  console.log(bar); // undefined
  console.log(foo); // ReferenceError: Cannot access 'foo' before initialization
  var bar = 1;
  let foo = 2; // 暂时性死区结束(对 foo 而言)
}

顶级作用域和函数作用域:let 不会在全局对象上创建属性

var x = "global";
let y = "global";
console.log(this.x); // "global"
console.log(this.y); // undefined

let不允许重复声明

let x = 1;

{
  var x = 2; // 重复声明的 SyntaxError
}

*编译

分词/词法分析:分解(var a=2=> var,a,=,2)

解析/语法分析:词法数组=>程序语法 结构的“抽象语法树”(a->2)(Abstract Syntax Tree,AST)

代码生成:将 AST 转换为可执行代码

你可能感兴趣的:(前端面试,前端,javascript,算法)