文章参考:ECMAScript 6 入门-let 和 const 命令
let命令有四大主要特性:存在块级作用域,没有变量提升,暂时性死区,不允许重复声明
1、存在块级作用域
{
let a = 10;
var b = 1;
}
console.log(a); //出错 not defined
console.log(b); //1
(function(){
var a = 1;
}());
console.log(a); //出错,not defined
{
let a = 1;
}
console.log(a); //出错, not defined
2、没有变量提升
console.log(a); //undefined
var a =1;
// 上述代码等价于
var a
console.log(a)
a = 1
console.log(a); //出错, not defined
let a = 1;
3、暂时性死区
而又因为不存在变量提升,因此在未使用let声明变量前,该变量都不可使用,其在语法上称为“暂时性死区”。
let a = 1;
if(true){
a = 2; //出错 not defined
let a;
}
var a = 1;
if(true){
a = 2; //var允许重复声明,而且变量提升,故a=2正常赋值var a;
}
4、不允许重复调用
{
let a = 1;
let a = 2;
} //出错 let不可重复声明
{
var b = 1;
let b = 1;
} //出错 let不可重复声明
function func(arg) {
let arg;
}
func() // 报错
1、为什么需要块级作用域?
// 没有块级作用域,内层变量会覆盖外层变量
var time = new Date()
function fun (){
console.log(time)
if(false){
var time = 'hello world'
}
}
fun()
// 没有块级作用域,用来循环的计数变量会泄露为全局变量
var string = 'hello world'
for(var i=0;i
2、ES6的块级作用域
function fun2 (){
let num = 100
if (true){
let num = 200
}
console.log(num)
}
fun2() // 100
for (let k=0;k<10;k++){
console.log(k)
}
console.log('循环结束')
console.log(k) // ReferenceError: k is not defined
3、ES6中块级作用域允许其任意嵌套,外层作用域无法读取内层作用域的变量
{{{{
{let insane = 'Hello World'}
console.log(insane); // 报错
}}}};
const arr = []
arr.push('hello wrold') // 可执行
arr.length = 0 // 可执行
arr = ['hello everyone'] // arr is read-only
const person = {}
person.name = 'zhangsan' // 可执行
console.log(person.name) // zhangsan
person = {} //person is read-only
const person = Object.freeze({})
person.age = 30
person.name = 'zhangsan'
console.log(person.age) // undefined
console.log(person.name) // undefined
console.log(person)
var constantize = (obj) => {
Object.freeze(obj);
Object.keys(obj).forEach( (key, i) => {
if ( typeof obj[key] === 'object' ) {
constantize( obj[key] );
}
});
};