ES6——let和const的用法
阿新 • • 發佈:2018-11-06
一、let
1.let命令, 用於宣告變數,只在let命令所在的程式碼塊內有效
es5中的作用域有兩種,全域性作用域和函式作用域,es6中let為js新加入了塊級作用域,這表示外層程式碼塊不受內層程式碼塊的影響。let命令只在當前塊級作用域內有效。ES6 允許塊級作用域的任意巢狀。允許在塊級作用域之中宣告函式,但是該函式只能在該塊級作用域內有效。
注:在es6的瀏覽器中,es6為了相容老程式碼,有如下規定
- 允許在塊級作用域內宣告函式。
- 函式宣告類似於
var
,即會提升到全域性作用域或函式作用域的頭部。 - 同時,函式宣告還會提升到所在的塊級作用域的頭部。
{ let a = 10; var b =1; } console.log(b);//1 console.log(a);//a is not defined 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
2.let不存在變數的宣告提前
宣告提前:在js中var定義變數時,可以先使用變數,後定義。而let定義變數時不存在變數的宣告提前,即變數必須先定義後使用。
console.log(a); // 輸出undefined
var a= 2;
// let 的情況
console.log(b); // b is not defined
let b= 2;
3.暫時性死區
暫時性死區:es6規定,如果塊級作用域記憶體在let或const命令,那麼在該塊級作用域中,let和const就會行成封閉作用域,不受外界影響。凡是在宣告之前就使用這些變數,就會報錯。
var a = 123; if (true) { a = 'abc'; // a is not defined let a; } console.log(a);
4.不允許重複宣告
let不允許重複宣告變數
// 報錯 function func1() { var a = 10; var a = 1; console.log(a); } // 報錯 function func2() { let a = 10; var a = 1; console.log(a); } // 報錯 function func3() { let a = 10; let a = 1; console.log(a); } func1(); // 1 func2(); // Identifier 'a' has already been declared func3(); // Identifier 'a' has already been declared
二、const
1.一旦宣告,不可改變
2.一旦宣告,必須賦值
3.存在暫時性死區
4.不可重複宣告
5.不存在宣告提前,必須先定義後使用
6.常量名常用全大寫字母
const PI = 3.1415;
PI = 3.14; // Assignment to constant variable;
const a; //Missing initializer in const declaration
a = 10;
if (true) {
const a = 5;
}
console.log(a); // a is not defined
if (true) {
console.log(a); // a is not defined
const a = 5;
}
var a = "a";
let b = 25;
const a = "b"; // Identifier 'a' has already been declared
const b = 30; // Identifier 'b' has already been declared
注:
對於引用型別資料(主要是物件和陣列)來說,const定義常量,並不是常量的值不得改動,而是常量指向的那個記憶體地址所儲存的資料不得改動。const
只能保證這個指標是固定的(即總是指向另一個固定的地址),至於它指向的資料結構是不是可變的,就完全不能控制了。
const a = {};
a.name = 'lilei';
a.age = 23;
console.log(a);
a = {}; // Assignment to constant variable;