【ES6】let 命令

let命令javascript

爲es6新增命令,用來聲明變量,相似於var,可是let所聲明的變量,只在let命令所在的塊級做用域內有效java

塊級做用域寫法(ES6塊級做用域容許任意嵌套):es6

// 塊級做用域寫法
{
  let tmp = ...;
  ...
}

 

塊級做用域例1數組

for (let i = 0; i < 10; i++) {
  // ...
}

console.log(i);
//ReferenceError: i is not defined

解析:上面代碼中,i做用域for循環體內,在循環體外引用就會報錯。函數

塊級做用域例2spa

function f1() {
  let n = 5;
  if (true) {
    let n = 10;
  }
  return n 
}
console.log(f1())//5

解析:栗子說明,外層代碼塊不受內層代碼塊的影響。code

 

 

---------------------------------------------------------------------------------------------------------------------------------blog

let與var的區別ip

1.var 沒有塊級做用域,let有塊級做用域內存

var實例

var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 10

分析:代碼中,i全局範圍內有效,因此全局只要一個變量i。每一次循環,變量i的值都會發生變化,而數組a函數內部的console.log(i),裏面的i和全局i爲同一個。

let實例

var a = [];
for (let i = 0; i < 10; i++) {
 a[i]
= function () { console.log(i); }; } a[6](); // 6

分析:代碼中的i使用let聲明的,只在本輪循環有效,每一次循環的i其實都是一個新的變量(why?javascript引擎內部會記住上一輪循環的值,初始化本輪的變量i時,就在上一輪循環的基礎上進行計算)

另外,for循環還有一個特別之處,就是設置循環變量的那部分是一個父做用域,而循環體內部是一個單獨的子做用域

for (let i = 0; i < 3; i++) {
  let i = 'abc';
  console.log(i);
}

2.var 存在變量提高let不存在變量提高("變量提高"是指變量能夠在聲明以前使用,值爲undefined·)

例:

/ var 的狀況
console.log(foo); // 輸出undefined
var foo = 2;

// let 的狀況
console.log(bar); // 報錯ReferenceError
let bar = 2;

 3.let暫時性死區

只要塊級做用域內存在let命令,它所聲明的變量的做用域就是這個區域,

例如

var tmp = 123;

if (true) {
  tmp = 'abc'; // ReferenceError
  let tmp;
}

解析:tmp的做用域爲塊級做用域,報錯緣由:未聲明直接使用,

4.let不容許重複聲明

let不容許在相同的做用域內,重複聲明同一個變量

例子

// 報錯 Uncaught SyntaxError: Identifier 'a' has already been declared
function func() {
  let a = 10;
  var a = 1;
}

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

 

擴展:不能在函數內部從新聲明參數

function func(arg) {
  let arg; // 報錯,相同的做用域內
}

function func(arg) {
  {
    let arg; // 不報錯 函數參數arg 和此處的arg不在同一個做用域內
  }
}

 總結:

1.let命令有塊級做用域
2.let命令先聲明再使用
3.let命令不可重複聲明(同一做用域)

 

 

相關資料:http://es6.ruanyifeng.com/#docs/let

做者:smile.轉角

QQ:493177502

相關文章
相關標籤/搜索