变量
Apr 30, 2019 5:06·463 words ·1 minutes read
var
- var 的作用域是函数作用域
- var 不在函数中使用,则作用域是全局作用域
- 在全局作用域中,使用 var 声明的变量会作为全局对象 window 的属性
- var 允许在同一作用域中声明同名的变量
let
- let 的作用域是块作用域
- let 不在块中使用,则作用域是全局作用域
- 在全局作用域中,使用 let 声明的变量不会作为全局对象 window 的属性
- let 不允许在同一作用域中声明同名的变量
const
- const 一旦声明一个变量,就必须马上初始化
深入理解
js引擎在读取js代码时会进行两个步骤:
- 第一个步骤是解释。
- 第二个步骤是执行。
所谓解释就是会先通篇扫描所有的Js代码,然后把所有声明提升到顶端,第二步是执行,执行就是操作一类的。
例子
a = 'javascript'; var a; console.log(a);//'javascript'
console.log(b);//undefined var b='javascript'
预解析
- 将 var 和 function 声明提升
- !注意: 同时声明又定义时,变量不会提升
- 函数声明直接把整个函数提升到执行环境的最顶层
- 将 var 和 function 声明提升
暂时性死区 (TDZ)
- 当程序的控制流程在新的作用域(module, function或block作用域)进行实例化时,在此作用域中的用 let/const 声明的变量会先在作用域中被创建出来,但是因为此时还未进行词法绑定,也就是对声明语句进行求值运算,所以是不能被访问的,访问就会抛出错误。因此,在这运行流程一进入作用域创建变量,到变量开始可被访问之间的一段时间,就称为TDZ(暂时死区)。