1、let和const命令

1、let命令

基本用法

用來聲明變量,類似于var,但是所聲明的變量只在let命令所在的代碼塊內有效。
for循環中適合使用let:

var a = [];
for (let i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6]();//6,如果用var聲明i,輸出會是10。

不存在變量提升

let命令不會提升聲明,即先使用后聲明不會返回undefined,會直接報錯。

// var 的情況
console.log(a); // 輸出undefined
var a= 2;

// let 的情況
console.log(a); // 報錯
let a= 2;

暫時性死區

當前作用域存在let命令時,其聲明的變量將綁定這個區域,不受外部影響,即必須要在聲明之后,才能使用此變量,即使它在外部已聲明過。
任何在聲明語句執行結束前的使用都會報錯,包括typeof檢測。
其本質是:只要進入當前作用域,所有變量就已存在,但不可獲取,只有當聲明變量那行代碼執行完畢,才可獲取和使用。

a=1; // 報錯
let a;

typeof a; // 報錯
let a; //如果使用的是var,上一行代碼會返回undefined

不允許重復聲明

let不允許在相同作用域內,重復聲明同一個變量。

// 報錯
function () {
  let a = 10;
  var a = 1;
}

// 報錯
function () {
  let a = 10;
  let a = 1;
}

2、塊級作用域

ES6 的塊級作用域

let實際上為JavaScript新增了塊級作用域

function fun() {
  let a = 5;
  if (true) {
    let a = 10;
  }
  console.log(a); // 5
}

塊級作用域的出現,讓立即執行行數表達式可以簡化:

(function () {
  var a = ...;
  ...
}());

//簡化為:

{
  let a = ...;
  ...
}

塊級作用域與函數聲明

在塊級作用域內,應盡量避免聲明函數,若必須聲明,則應該寫成行數表達式,而不是函數聲明,因為函數聲明會被提升到塊級作用域的頭部。

(function () {
  if (false) {
    function f() { console.log('I am inside!'); }
  }
  f();
}());

//因為函數聲明提升,上述代碼在ES6中實際相當于:

(function () {
  var f = undefined;
  if (false) {
    function f() { console.log('I am inside!'); }
  }
  f();//此時f不是一個函數,會報錯。
}());

3、const命令

基本用法

const命令聲明的是一個常量,一旦聲明,就不允許改變。
所以聲明時必須初始化,只聲明不賦值的const命令會報錯。
const聲明與let相似:

  1. 不提升變量。
  2. 存在暫時性死區。
  3. 只在聲明后使用。
  4. 只在塊級作用域內有效。
  5. 不可重復聲明。

const命令聲明對象時,此對象的屬性的值依然可改變,對象本身不可改為新對象,聲明數組時同理。

const obj= {};
// 為 obj 添加一個屬性,可以成功
obj.pro = 123;
obj.pro // 123
// 將 obj 指向另一個對象,就會報錯
obj= {};

const a = [];
a.push('Hello'); // 可執行
a.length = 0;    // 可執行
a = ['world']; // 報錯 

4、頂層對象的屬性

瀏覽器環境下頂層對象是指window對象。
var、function聲明的全局變量是window對象的屬性,let、const、class聲明的變量則不是。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容