es6 let使用總結

中午偷個閒作個es6let的使用總結es6

做用域塊

  • 在做用域塊中聲明的變量不受外部的影響,見例子
{
let a= 10;
{
let a= 20;
console.log('子做用域', a);// 20
}
console.log('父做用域', a);// 10
}
  • let聲明的變量只在let命令所在的代碼塊中有效,見例子
// 例子一
{
let a= 10;
var b= 20;
}
console.log(a)  // ReferenceError: a is not defined.會報引用錯誤
console.log(b)  // 20 

//例子二
// 使用var聲明,則會提高爲外層變量,次例子中的i提高爲外層變量,也就是提高到上一個執行上下文
var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 循環執行完後,i被賦值爲10,因此最終結果爲10

// 使用let申明i,當前的i只在本輪循環有效,因此每一次循環的i其實都是一個新的變量,因此最後輸出的是6
// for循環還有一個特別之處,就是設置循環變量的那部分是一個父做用域,而循環體內部是一個單獨的子做用域
var a = [];
for (let i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 6
  • ES6 的塊級做用域容許聲明函數的規則,只在使用大括號的狀況下成立,若是沒有使用大括號,就會報錯。
  • 考慮到環境致使的行爲差別太大,應該避免在塊級做用域內聲明函數。若是確實須要,也應該寫成函數表達式,而不是函數聲明語句
'use strict';
{
if (true) // 報錯
function func() {

}
}

沒有變量提高(這個好理解就不說了)


暫時性死區(借用阮一峯老師的說辭)

  • 在使用let聲明以前,該變量是不可以使用的,否則會報錯,見栗子:
{
let a= 10;
{
// 在該做用域裏面,a尚未聲明完成
console.log(a); // ReferenceError: a is not defined
let a= 20;   // 若是這裏不聲明就不會報錯,則a引用的是父做用域的a
console.log(a); // 20
}
}

不容許在做用域內重複申明同一個變量,見例子

// 報語法錯誤
{
let a= 10;
let a= 20; 
}
// 因此不能在函數內部從新聲明參數
function func(arg) {
let arg= 20;
}

意義

  • ES6 規定暫時性死區和let、const語句不出現變量提高, 主要是爲了減小運行時錯誤,防止在變量聲明前就使用這個變量,從而致使意料以外的行爲
  • 內部變量可能覆蓋外層變量
var a= 10;
function func(){
console.log(a);  // undefined
if(false) {
var a= 20; // 在該執行上下文裏,'變量對像'建立的過程當中會作變量提高,肯定做用域鏈,因此console時輸出的是內部這個a,並不會改變外層的a,至關於從新申明瞭一個變量a,指向不一樣於外層a變量的棧內存的地址,也因爲不一樣的執行上下文,不一樣的變量對像
}
}
func() 
console.log('外層a',a)  // 10
相關文章
相關標籤/搜索