预解析

js在执行js代码前会进行预解析

js引擎会把里面所有的var 和function 提升到作用域的最前面
然后按照代码的书写顺序从上至下的执行代码

预解析分为 变量预解析(变量提升) 和 函数预解析(函数提升)
提升:把变量和函数的声明提升到当前作用域最前面 但不提升赋值操作
console.log(num) var = num
var num = 10 == console.log(num) //undefined
num = 10

*所以函数表达式必须写在函数调用前面

原因:在上下文创建阶段JS 解释器会找出需要提升的变量和函数,并且给他们提前在内存中开辟好空间,函数的话会将整个函数存入内存中,变量只声明并且赋值为 undefined,所以在第二个阶段,也就是代码执行阶段,我们可以直接提前使用。在提升的过程中,相同的函数会覆盖上一个函数,并且函数优先于变量提升

let 定义变量

let 使用来声明变量 的 取代 var
使用let关键字声明变量没有变量提升, 只能先声明后使用

注意:不能重复声明同名变量

let关键字具有块级作用域 (变量只在块级有效)
块 代码块: if for while

暂时性死区

  1. let f = 20 ;
  2. if(true){
  3. f = 30;
  4. let f;
  5. }


只要在块级作用域 使用let 它所声明的变量 就与这个块绑定,与外界没有关系

使 typeOf 也会报错 ReferenceError
反而 typeOf 一个根本没有声明的变量不会报错
image.png

暂时性死区的本质是:只要一进入作用域,所使用的变量就是已经存在了,但是不可取
只有等到声明变量的哪一行代码出现,才可以使用和使用该变量

在for () 中使用let 关键字声明的变量属于块级作用域下的变量
由于for 循环了多次,所以声明了多个块级作用域
每一个块级作用域都有属于自己的i变量

  1. let arr = [];
  2. for (let i = 0; i < 2; i++) {
  3. arr[i] = () => console.log(i);
  4. }
  5. arr[0](); //0
  6. arr[1](); //1


const

const 作用:声明常量,常量就是值(内存地址) 不能变化的值
注意:
1.常量在声明是必须赋值
2.常量值不能变化(引用对象可以去改变内部的值)
3.具有块级作用域
_

let const var 区别

_

var let const
函数级作用域 块级作用域 块级作用域
变量 变量 常量



_