1. 程式人生 > >es6 - 一共有 6 種聲明變量的方法(var, function, let, const, class, import)

es6 - 一共有 6 種聲明變量的方法(var, function, let, const, class, import)

bject style ron func token 重復 常量 tor 代碼

  • let聲明的變量只在它所在的代碼塊有效。
  • 不存在變量提升
  • let不允許在相同作用域內,重復聲明同一個變量
  • 暫時性死區,只要塊級作用域內存在let命令,它所聲明的變量就“綁定”(binding)這個區域,不再受外部的影響, 定義之前不能使用。
  • 應該避免在塊級作用域內聲明函數。如果確實需要,也應該寫成函數表達式,而不是函數聲明語句。

for循環的計數器,就很合適使用let命令。

for (let i = 0; i < 10; i++) {let i = ‘abc‘;}
// 變量ilet聲明的,當前的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)