ES6英華:Let & Const

letconst都是聲明變量的新體式格局。
平常的,由於這兩種聲明體式格局的特性,如今項目組的開闢範例中都邑請求:不運用var而是letconst

Const

const用於定義不可變動的常量。
不可變動,意義是標識符存儲的值不可變動。
這意味着,假如存儲的是對象的地點,修正地點指向的內存是能夠的。

"use strict";

const OBJ = {};
OBJ.name = "OBJ"; // 勝利
OBJ = {}; // 失利,改變了存儲的地點。

由此可聯想到ES5的凝結對象。
假如對象的屬性是個指針,依然是能夠修正的。
所以,最最終的要領是一層一層凝結一切對象。

塊級作用域

let使{}呈現出塊級作用域的特性。
聲明的變量僅存在於當前塊級作用域中。
不可在統一塊級作用域中反覆聲明變量。
一旦在塊級作用域中聲清楚明了變量,此變量便綁定在這個地區,不再受外部的影響。

"use strict";

if (true) {
  var a = 1;
  let b = 2;
}
console.log(a); // 1
console.log(b); // error, b is not defined.

定義函數

在塊級作用域中,優先運用表達式聲明函數(let, const, var)。
不要運用聲明式聲明函數,由於差別瀏覽器在這方面的完成有所差別。
Chrome中,嚴厲形式下等價於運用let聲明,非嚴厲下等價於運用var

// 在 Chrome 66 瀏覽器。

// --- 嚴厲形式
"use strict";

console.log(fn); // error, fn is not defined.
if (true) {
  function fn() {
    console.log('hi');
  }
}
console.log(fn); // error, fn is not defined.

// --- 非嚴厲形式。
console.log(fn); // undefined
if (true) {
  function fn() {
    console.log('hi');
  }
}
console.log(fn); // function

暫時性死區

塊級作用域的頂部到聲明此變量之前的地區,稱為此變量的暫時性死區。
在暫時性死區內,不能運用該變量。

"use strict";

let a = 1;
{
  // 在這裏運用 a 會報錯。
  let a = 2;
}

// 對照 var
var b = 2;
fn();
console.log(b); // 2

function fn() {
  b = 1;
  var b;
  console.log(b); // 1
}

let也存在變量提拔,只不過看待體式格局和之前差別。
變量提拔,簡樸的說就是在實行代碼前先會看究竟聲清楚明了哪些變量和要領。
ES5中運用var聲明的變量,在聲明之前能夠接見,其值為undefined
ES6中運用let聲明的變量,為了堅持順序的嚴謹性,不允許被接見。

解綁全局變量

在之前的版本中,全局變量等價於頂層對象的響應屬性。
ES6中新的變量聲明體式格局(let, const, class)定義的全局變量與頂層對象的屬性脫鈎。

const MY = {};
console.log(window.MY); // undefined

替換自實行函數

定義暫時變量

// ---ES5
(function() {
  var a = 1;
})();

// ---ES6
{
  let a = 1;
}

簡化for循化

// ---ES5
// 運用自實行函數獵取並割斷變量,再用閉包存儲變量
var fns = [];
for (var i = 0; i < 7; i++) {
  fns[i] = (function(n) {
    return function() {
      console.log(n);
    };
  })(i);
}
fns[3](); // 3

// ---ES6
var fns = [];
for (let i = 0; i < 7; i++) {
  fns[i] = function() {
    console.log(i);
  };
}
fns[3](); // 3

for+let組合的明白

for背面的()是一個自力的作用域。
for背面的{}是一個自力的作用域。
for背面的{}中的作用域鏈為:自身 > () > 外部。
每次輪迴,都邑從新在()里定義i,並將其值設置為其上次輪迴完畢的值。

// 證實 () 是一個自力的作用域。
let i = 3;
for (let i = 0; i< 7; i++) {}
console.log(i); // 3

// 證實 {} 的作用域鏈為:自身 -> ()作用域 -> 外部作用域。
for (let i = 0; i< 7; i++) {
  i = 7;
  console.log(i); // 紙打印一次,值為 7 。
}
for (let i = 0; i< 7; i++) {
  let i = 'hi';
  console.log(i); // 打印 7 次 'hi' 。
}
    原文作者:wmaker
    原文地址: https://segmentfault.com/a/1190000015054707
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞