预解析
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
暂时性死区
let f = 20 ;
if(true){
f = 30;
let f;
}
只要在块级作用域 使用let 它所声明的变量 就与这个块绑定,与外界没有关系
使 typeOf 也会报错 ReferenceError
反而 typeOf 一个根本没有声明的变量不会报错
暂时性死区的本质是:只要一进入作用域,所使用的变量就是已经存在了,但是不可取
只有等到声明变量的哪一行代码出现,才可以使用和使用该变量
在for () 中使用let 关键字声明的变量属于块级作用域下的变量
由于for 循环了多次,所以声明了多个块级作用域
每一个块级作用域都有属于自己的i变量
let arr = [];
for (let i = 0; i < 2; i++) {
arr[i] = () => console.log(i);
}
arr[0](); //0
arr[1](); //1
const
const 作用:声明常量,常量就是值(内存地址) 不能变化的值
注意:
1.常量在声明是必须赋值
2.常量值不能变化(引用对象可以去改变内部的值)
3.具有块级作用域
_
let const var 区别
_
var | let | const |
---|---|---|
函数级作用域 | 块级作用域 | 块级作用域 |
变量 | 变量 | 常量 |
_