1. 程式人生 > >let變數和const常量

let變數和const常量

let 1-1、let宣告的變數只在let命令所在的程式碼塊內有效 { let a = 1; var b = 2; } console.log( a ); // ReferenceError: a is not defined console.log( b ); // 1 沒有塊級作用域,只有函式和全域性作用域

1-2、let變數在for迴圈中只在迴圈體中有效;

for( let i = 0; i < 5; i++ ){
  console.log( i ); 1、2、3、4
}
console.log( i );  // ReferenceError: i is not defined

1-3、let變數在for迴圈中每次迴圈的變數只在本輪迴圈中有效,每次迴圈都是一個新的變數; var a = []; for( let i = 0; i < 10; i++ ){ a[ i ] = function(){ console.log( i ); } }; a

6 ; // 6

1-4、for迴圈中,設定迴圈變數的部分是【父作用域】;迴圈體內部是單獨的【子作用域】 for( let i = 0; i < 3; i++ ) ==> 父 { ==> 子 let i = sun; console.log( i ); // sun // sun // sun }

2-1、let宣告的變數不存在變數提升: let宣告的變數一定要在聲明後使用;如果在變數宣告之前用到它,會丟擲 【ReferenceError】的錯誤;

console.log( bar ); // ReferenceError
let bar = 1;

2-2、暫時性死區: 只要塊級作用域記憶體在let命令,它所宣告的變數就【繫結binding】這個區域,不在受外部影響; 如果區塊中存在let和const命令,這個區塊對這些命令宣告的變數會形成【封閉作用域】。只要在宣告變數之前 使用該變數,就會報錯。 var tmp = 1; if( true ){ tmp = 2; // ReferenceError let tmp; }

暫時性死區本質:只要進入當前作用域,所要使用的變數就已經存在,但是不可獲取;
只有執行到宣告變數的那一行程式碼出現,才可以在【宣告變數的後面】獲取和使用該變數。
let x = x;  // x is not defined   宣告之前不允許獲取x的值

2-3、let不允許在【相同作用域內】重複宣告同一個變數 function () { let a = 10; let a = 1; // 報錯 }

function ( arg )
{
  let arg;      // 報錯  形參【arg】是暫時性死區
}

function ( arg )
{
  {
    let arg;     // 不報錯【內層作用域不受外層作用域影響】
  }
}

3-1、let的塊級作用域: let宣告變數繫結的作用域不受內層作用域的影響; 內層作用域可以定義外層作用域的同名變數; 外層作用域無法讀取內層作用域的變數;

3-2、do表示式:本質上,塊級作用域是一個語句,將多個操作封裝在一起,沒有返回值; { let t = f(); t = t * t + 1; } 在塊級作用域之前加上【do】,使它變成【do表示式】,x會得到整個塊級作用域的返回值 let x = do { let t = f(); t * t + 1; }

const命令 1-1、const宣告一個只讀的常量,常量的值不能改變(Object除外); const PI = 3.1415926; console.log( PI ); // 3.1415926

   PI = 10;
   TypeError: Assingment to constant variable

1-2、const一旦宣告常量,就必須立即初始化,不能留到以後賦值; const foo; // SyntaxError: Missing initializer in const declaration

1-3、const的作用域只在宣告所在的塊級作用域內有效; if( true ) { const MAX = 5; } console.log( MAX ); // Uncaught ReferenceError: MAX is not defined

1-4、const命令宣告的常量不允許提升,同樣存在暫時性死區,只能在聲明後使用; if( true ) {· console.log( MAX ); // ReferenceError const MAX = 5; }

1-5、const常量不允許重複宣告 const message = ‘hello’; const message = ‘world’; // 報錯

   const本質:const實際上保證的並不是變數的值不得變動,而是變數指向的那個【記憶體地址】不得改動。
              對於簡單資料型別的資料(數值、字串、布林值)而言,值就儲存在變數指向的【記憶體地址】中,
	  因此等同於常量。
              但對於複合型別的資料【物件和陣列】而言,變數指向的是【記憶體地址中儲存的一個指標】,(指向的是引用型別的地址)
              const只能保證這個指標是固定的,至於它指向的資料結構是不是可變的,完全不能控制;

塊級作用域域函式宣告 ES6引入了塊級作用域,明確允許在塊級作用域之中宣告函式; 在塊級作用域之中,函式宣告語句的行為類似於let,在塊級作用域之外不可引用 ES6的塊級作用域允許宣告函式的規則只在使用大括號的情況下成立,如果沒有使用大括號,就會報錯;

ES6宣告變數的6中方法 var、function、let、const、import、class