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