es6 - 一共有 6 種聲明變量的方法(var, function, let, const, class, import)
阿新 • • 發佈:2019-03-25
bject style ron func token 重復 常量 tor 代碼
let
聲明的變量只在它所在的代碼塊有效。- 不存在變量提升
let
不允許在相同作用域內,重復聲明同一個變量- 暫時性死區,只要塊級作用域內存在
let
命令,它所聲明的變量就“綁定”(binding)這個區域,不再受外部的影響, 定義之前不能使用。 - 應該避免在塊級作用域內聲明函數。如果確實需要,也應該寫成函數表達式,而不是函數聲明語句。
for
循環的計數器,就很合適使用let
命令。
for (let i = 0; i < 10; i++) {let i = ‘abc‘;}
// 變量i
是let
聲明的,當前的i
只在本輪循環有效,每一次循環的i
其實都是一個新的變量
// 設置循環變量的那部分是一個父作用域,而循環體內部是一個單獨的子作用域
//死區: if (true) { // TDZ開始 tmp = ‘abc‘; // ReferenceError console.log(tmp); // ReferenceError let tmp; // TDZ結束 console.log(tmp); // undefined tmp = 123; console.log(tmp); // 123 }
const
聲明一個只讀的常量。一旦聲明,常量的值就不能改變- 不存在變量提升
- let不允許在相同作用域內,重復聲明同一個變量
const
一旦聲明變量,就必須立即初始化,不能留到以後賦值- 只在聲明所在的塊級作用域內有效。
- 存在暫時性死區
const,變量指向的那個內存地址所保存的數據不得改動,
只能保證這個指針是固定的,至於它指向的數據結構是不是可變的。因此,將一個對象聲明為常量必須非常小心。
// 凍結對象:不可添刪屬性 const foo = Object.freeze({});
// 凍結對象,並凍結對象屬性
var constantize = (obj) => { Object.freeze(obj); Object.keys(obj).forEach( (key, i)=> { if ( typeof obj[key] === ‘object‘ ) { constantize( obj[key] ); } }); };
es6 - 一共有 6 種聲明變量的方法(var, function, let, const, class, import)