let
ES6新增的let命令,用来声明变量,但是声明的变量只在声明所在的代码块中有用。
// let的块级作用域
function test(){
for(let i = 0; i < 2; i++){
console.log(i); //可以输出
}
console.log(i); //undefined
}
像for循环中的计数器,就非常适合使用let来定义
//var
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 10
//let
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 6
需要注意let不能重复声明变量,也不能在函数内部重新声明参数
//let不能重复定义
function demo(){
let i = 0;
let i = 1; //会报错,i重复定义了
}
function func(arg) {
let arg;
}
func() // 报错
function func(arg) {
{
let arg;
}
}
func() // 不报错
var在使用中存在有变量提升的现象,就是变量可以在声明前使用,为undefined,而let并不支持这种做法,如果在let声明前使用,会报错ReferenceError。
// var
console.log(a); // undefined
var a = 2;
// let
console.log(b); // 报错 ReferenceError
let b = 2;
暂时性死区
在块级作用域中使用let声明变量,被声明的变量就会绑定这个块级作用域,不再受到外部的影响。
var test = 123;
if (1<2) {
test = 'test'; // ReferenceError 此时的test以及绑定了let声明的test,与外部无关
let test;
}
const
// const
function getPi(){
const PI = 3.1415926;
console.log(PI);
PI = 8;//会报错,PI is read-only
console.log(PI);
}
//const和let一样是存在块级作用域的
//const在声明时必须赋值
//const命令声明的常量也是不提升,同样存在暂时性死区,只能在声明的位置后面使用。
需要注意的是,const在声明常量后是不能重新赋值的,但是const声明Object后,Object对于的内容是可变的。
function test(){
const o = {
a : 1
}
o.b = 2; //不会报错
console.log(o);
}
因为Object是引用类型,对象最终的返回值是该对象在内存中的地址,也就是声明的o这个对象其实就是指向了内存中的地址,而这个地址是不可变的,但是对象本身是可变的。因此,将一个对象声明为常量必须非常小心。
网友评论