--- tags: Javascript --- # JS let const筆記 ## let 1. let無法再次宣告 同一函數或塊範圍內重新聲明同一變量會引發`SyntaxError` ```javascript= let num = 1; let num = 2; // SyntaxError ``` 但使用`var`是可以重新宣告的 ```javascript= let num = 1; var num = 2; ``` 2. 限制作用域 `let`不會在全域物件中建立,`var`則是在全域中建立(window) ```javascript= var x = 'global'; let y = 'global'; console.log(this.x); // "global" console.log(this.y); // undefined ``` 利用迴圈查看 可以看到如果使用let宣告,並不會複寫,因為每一個迴圈等同於一個執行環境,程式碼執行之後 JavaScript 會將變數指向到該記憶體位置,因此就不會釋放掉,等到呼叫時就可以找到相關記憶體位置 ```javascript= for(let i=0; i <= 10; i++) { setTimeout(function(){ console.log(i); // 輸出一到十 }) } console.log(i); // ReferenceError ``` 使用var就會汙染到環境 ```javascript= for(var i=0; i <= 10; i++) { setTimeout(function(){ console.log(i); // 10跑十次 }) } console.log(i); // 10 ``` 3. 暫時性死區 let 在創造階段與執行階段之間有一個暫時性死區 ```javascript= console.log(num); // ReferenceError let num = 1; ``` 與var差異 ```javascript= console.log(num); // undefined var num = 1; ``` ## const 想要宣告常數,可以使用const宣告,`常數不能重複指定值,也不能重複宣告`,`const`也常拿來宣告物件,因為他是傳參考特性,只修改屬性質是可以的 1. 宣告常數 不能重複指定值 ```javascript= const DISCOUNT = 10; DISCOUNT = 15; // TypeError: Assignment to constant variable. ``` 2. 宣告物件 使用`const`宣告的物件被凍結後就無法被修改,如果是使用`var`物件屬性不能修改但是物件本身是會被修改的 以下使用`var`宣告 ```javascript= var human = { name: 'joe', moner: 50 } human.name = "abc"; Object.freeze(human); human.moner = 100; human = {}; // human被修改 ``` 使用`const` ```javascript= const human = { name: 'joe', moner: 50 } human.name = "abc"; Object.freeze(human); human.moner = 100; human = {}; // TypeError: Assignment to constant variable. ``` ## 練習ES6 [Airbnb JavaScript 風格指南](https://github.com/airbnb/javascript) 編輯器可以安裝[`ESLINT`](https://github.com/eslint/eslint)