1. var 会污染全局对象(易被忽略)
var在全局声明的变量存在于VO(g)全局变量对象中,并且也会复制一份到GO中,let和const不会。注意这个仅限于在全局申请的变量。var声明的变量会污染全局对象,let、const不会。
var a = 1; window.a // 1
let a = 1; window.a //undefined
const a = 1; window.a //undefined
2. var是可以重复申明
var是可以重复申明的,词法解析可以审核通过,执行阶段遇到已经申明过的,不会重复申明,但是let不行,在词法解析阶段都过不去,不也存在引擎去执行代码的阶段了。
3. var存在变量提升
var存在变量提升,let、const不存在变量提升,还有一种说明是let、const存在变量提升,只是在申明的地方到提升的这区间中,存在一个暂时性死区,在这区间内使用变量会报错。
4. let、const可以形成块级作用域,var不会形成块级作用域
for(let i = 0; i < 5; i++) { setTimeout(() => { console.log(i); }, 10); } // let的实现原理其实和闭包是一样的 { // 1、let会先形成一个父块作用域,计数器累加 let i = 0; { // 每一次循环形成一个子块级作用域 let i = 0; // i每次递增 setTimeout(() => { console.log(i); }, 10); } i++; }
5. let、const会形成一个暂时性死区,var不会
网络异常,图片无法展示
|
6. 指针的变化
let、const都是ES6新增声明的变量的语法,区别是let创建的变量是可以更改指针指向,也就是可以重新赋值,但是const申明的变量是不允许改变指针指向的。
7. 形参重新声明(易被忽略)
函数执行的时候,如果设置了形参变量(并且部分形参变量设置了ES6中的形参赋值默认值),这样在形成私有上下文的时候,会多创建一个块级上下文(函数的大括号单独看成一个块级上下文),并且在当前块级作用域上下文中重新声明了形参。
var x = 1; function func(x, y = function func1() {x = 2;}) { var x = 3; y(); console.log(x); // x = 3 } func(5); console.log(x); // x = 1
var x = 1; function func(x, y = function func1() {x = 2;}) { x = 3; y(); console.log(x); // x = 2 } func(5); console.log(x); // x = 1