es6(基礎一) let 和 const 命令

一、let

  1.   定義的變量只在代碼塊中有效
{
  var a =20;
}
console.log(a);//20
{
  let a = 20;
}
console.log(a);//報ReferenceError
{
  let a =30;
  {
    console.log(a);//30
  }
}

   2.在for循環外是訪問不到的

for(var i=0;i<3;i++){

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

}
console.info(j);//報ReferenceError

    3.不存在變量提升

console.log(foo);// 輸出undefined
var foo = 2;
console.log(bar);// 報錯ReferenceError
let bar = 2;

    4.暫時性死區 

        解讀:只要塊級作用域內存在let命令,它所聲明的變量就“綁定”(binding)這個區域,不再受外部的影響

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

        含義:只要一進入當前作用域,所要使用的變量就已經存在了,但是不可獲取,只有等到聲明變量的那一行代碼出現,纔可以獲取和使用該變量

    5.不能在函數內部重新聲明參數

{
  let a = 10;
  let a = 20;
  console.log(a);//報錯 Duplicate declaration "a"
}

    6.示例

var a = [];
for (var i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); // 10  用var定義,表示全局只有一個變量i,數組a的所有成員裏面的i,指向的都是同一個i,所以調用時輸出的都是最後一輪的i的值,即10

    es6之前的解決方式

var a = [];
for (var i = 0; i < 10; i++) {
  (function(i){
    a[i] = function () {
      console.log(i);
    };
  }(i))//採用立即執行函數(閉包)
}
a[6]();//6

var a = [];
for (let i = 0; i < 10; i++) {
  a[i] = function () {
    console.log(i);
  };
}
a[6](); //6 用let聲明,當前的i只在本輪循環有效,所以每一次循環的i其實都是一個新的變量,所以輸出的是6

二、const

    1.const聲明一個只讀的常量。一旦聲明,常量的值就不能改變

{
    const a = 10;
    a = 20;
    console.log(a);//"a" is read-only
}

    2.聲明必須賦值

{
  const a;//如果是let a;則會彈出undefined,不會報錯
  console.log(a);//報錯
}  

    3.對象(引用類型),可以修改賦值

{
    const obj = {
	user:"張三"
    }    
    obj.user = '李四';
    obj.pwd = '123455';
    console.info(obj.user,obj);//李四
}





發佈了23 篇原創文章 · 獲贊 3 · 訪問量 2636
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章