let和const
为什么要新增let
因为var不好用 缺陷如下: 1. var可以重复声明 2. var没有块级作用域 举个例子
var name = 'yinxu'
if(true){
var name = 'work'
console.log(name); //work
}
console.log(name); //work
let a = [];
//这是一个父作用域
for (let i = 0; i < 10; i++) { //这是一个子作用域一共产生10次
a[i] = function () { //当前的i只在本轮循环有用
console.log(i);
};
}
a[6](); // 6
let的特点
-
let不存在变量提升
var命令会存在变量提升的现象,即变量可以在声明之前使用,为了纠正这种现象let命令改变了语法行为,它所声明的变量一定要在声明后使用,否则回报错 例如 -
console.log(faa); //undefined var faa = 10 console.log(foo) //Uncaught ReferenceError: foo is not defined let foo = 1
-
暂时性死区
只要块级作用域内存在let命令,它所声明的变量就‘绑定’这个区域,不再受外部的影响var tmp = 123 if(true){ tmp = 'abc' //VM159:3 Uncaught ReferenceError: Cannot access 'tmp' before initialization let tmp; }
-
if(true){ tmp = 'aaa'; console.log(tmp); //报错 let tmp; console.log(tmp); //undefined tmp = 123; console.log(tmp); //123 }
一些死区比较隐蔽,不太容易发现
-
function bar (x=y,y=2){ return [x,y] } bar() //VM164:1 Uncaught ReferenceError: Cannot access 'y' before initialization
上述代码中之所以会报错就是因为x默认等于y,而此时y还没有声明,属于死区。
但是如果这么写就不会报错 -
function bar(x=2,y=x) { return[x,y] } bar() //[2,2]
总之,暂时性死区的本质就是,只要一进入当前作用域,所要使用的变量就已经存在了,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。
-
不允许重复声明
let不允许在相同作用域内重复声明同一个变量-
function func() { let a = 10 var a = 1 }
const的使用
-
const声明一个只读的常量,一旦声明常量的值就不会发生改变
const声明的变量不得改变值,这意味着,const一旦声明变量,就必须立即初始化,不能留到以后赋值。 -
const b //VM272:1 Uncaught SyntaxError: Missing initializer in const declaration const b = 10 //不报错 const b = 20 //Uncaught TypeError: Assignment to constant variable.
- 本质
- const实际上保证的并不是变量的值不变,而是变量指向的那个内存地址内的数据不变,对于简单数据类型(字符串,数字,布尔值)值就保存在
-