let 以及 const
let命令
- let 聲明的變量只在它所在的代碼塊有效。
//let 聲明 只在當前作用域有效
var a = [];
for (let i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 6
//var 聲明 在全局作用域有效
var a = [];
for (var i = 0; i < 10; i++) {
a[i] = function () {
console.log(i);
};
}
a[6](); // 10
- let 不存在變量提升士修,在let聲明之前使用變量,會報錯ReferenceError
// var 的情況
console.log(foo); // 輸出undefined
var foo = 2;
// let 的情況
console.log(bar); // 報錯ReferenceError
let bar = 2;
- let 不允許重復聲明
// 報錯
function () {
let a = 10;
var a = 1;
}
// 報錯
function () {
let a = 10;
let a = 1;
}
不能在函數(shù)內(nèi)部重新聲明參數(shù)
function func(arg) {
let arg; // 報錯
}
function func(arg) {
{
let arg; // 不報錯
}
}
const 命令
一旦聲明凛忿,常量的值就不改變澈灼,只在聲明所在的塊級作用域有效。
const 命令聲明的常量也是不提升店溢,同樣存在暫時性死區(qū)叁熔。
本質(zhì): const 實際上保證的,不是變量的值不能改動床牧,而是變量指向的那個內(nèi)存地址不得改動荣回。對于簡單的數(shù)據(jù)(數(shù)值、字符串戈咳、布爾值)心软,值就保存在變量指向的那個內(nèi)存地址,因此等同于常量著蛙。但對于復合類型(引用類型)的數(shù)據(jù)(主要是對象和數(shù)組),變量指向的內(nèi)存地址删铃,保存的只是一個指針, const 只能保證這個指針是固定的踏堡,至于它指向的數(shù)據(jù)結構是不是可變的猎唁,不能控制。