ES6里增加了一个let,可以在{}, if, for里声明。用法同var,但作用域限定在块级,let声明的变量不存在变量提升。
//--- 词法作用域
{
let a = 10;
var b = 10;
}
console.log(a); //报错
console.log(b); //10
let声明的变量在作用域外是访问不到的
块级作用域 if
function getVal(bool){
if(bool){
let val = 'red';
//访问到val
return val;
}else{
//访问不到val
}
//访问不到val
}
块级作用域 for
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function() {
console.log(i);
};
}
a[6](); //10
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function() {
console.log(i);
};
}
a[6](); //6
//等价于
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = (function(i) {
return function(){
console.log(i);
}
})(i);
}
a[6](); //6
块级作用域,存的不是引用,直接是i的值
** 变量提升(先使用后声明)**
function do_something() {
console.log(foo);
var foo = 2;
}
变量val先使用后声明,输出undefined,也不报错。
function do_something() {
console.log(foo);
let foo = 2;
}
//报错
let定义变量不能重复声明
{
let a = 10;
var a = 1;
}
// 报错
{
let a = 10;
let a = 1;
}
//报错
let的声明的变量不会挂载到全局属性
var a = 1;
window.a; //1
let b = 1;
window.b; //undefined