let
塊級作用域
ES6里增加了let,const, 聲明在{}, -> “function,if ,for等” 的變量作用域被限制在塊級。(嚴格模式下 function 變量屬于塊級作用域)
例:
{
let i = 0;
}
console.log(i);
//報錯Uncaught ReferenceError: i is not defined
同時還可以解決閉包問題, 例如我們為10個div綁定點擊事件, 肯定會去寫一個立即執行函數去解決閉包問題
var oDiv = document.getElementsByTagName('div');
for(var i = 0; i < 10; i++){
(function(j){
oDiv[j].onlick = function(){
alert(j);
}
})(i)
}
但在es6中就可以使用let解決這一問題
var oDiv = document.getElementsByTagName('div');
for(let i = 0; i < 10; i++){
oDiv[i].onlick = function(){
alert(i);
}
}
塊級作用域特點
一旦let在作用域中聲明變量 就將統治這個作用域
var a = 1;
{
console.log(a);
let a = 2;
}
//會報錯, a is not defined, 這時作用域里a使用了let定義, 導致作用域內形成死去, 不會去找全局變量的a.
因此使用let無法重復定義變量.
let a = 2;
let a = 1;
console.log(a);
//報錯, Identifier 'a' has already been declared
ES6 let 不存在變量聲明提升
在es6之前, 如果像這樣定義一個a變量不會報錯的, 但如果使用let定義, 則會報錯
console.log(a);
var a = 1;
//不會報錯, 輸出undefined;
console.log(b);
let b = 2;
//報錯, b is not defined
const
特點一: 一旦聲明常量的值就不能更改
const PI = 3.14;
PI = 3.14;
//報錯, Assignment to constant variable.
**特點二: ** 聲明一個常量必須馬上初始化
const PI;
PI = 3.14
//報錯, Missing initializer in const declaration
特點三: let 和 const 一樣不能重復聲明
const message = 'hello';
let age = 20;
const message = 'world';
let age = 10;
//報錯
**額外補充 : ** const指向變量的地址, 只要變量名所引用的地址不變就不會報錯, 例如:
const a = {name: [1,2,3]};
a.name[0] = 4;
//不會報錯
const foo = {};
foo.prop = 123;
console.log(foo.prop);
//不會報錯
foo = {};
//報錯