ES6-取代var的let跟const

let 跟 const

let可以重新賦值,const不能重新賦值(re-assign)

1
2
let age = 20;
age = 22;

1
2
3
4
5
6
7
const gender = "F";
gender = "M";//[錯誤]const不能重新賦值,會出錯

const point ={x:50,y:100}
body.weight = 60;//可以修改body物件

point ={x:200,y:100}//[錯誤]不可以把新的物件重新賦值給const,會出錯

先了解scope

了解var之前,要先了解Javascript的scope跟block

  • Scope(作用域)有兩種,function scopeglobal scope,只要不是在函式裡面,就是global scope
  • scope會由外往內繼承,反過來也就是說,內部會繼承外部的作用域

下方案例中,x屬於global scope,而f函式內屬於function scope,雖然funciton scope中沒有定義x,可是function scope中會繼承global scope,因此是可以印出x

1
2
3
4
5
6
7
var x =1;
function f(){
console.log(x);//x
}

f();
//x

兩個作用域都有分別定義x,因為先執行f函式,所以先進去f中執行印出2,接著回到global scope中執行印出1

1
2
3
4
5
6
7
8
9
var x = 1;
function f(){
var x = 2;
console.log(x);
}
f();
console.log(x);
//2
//1

什麼是block

用大括號包起來的範圍,就是block(除非物件的{})

  • 在程式碼中,可以隨時宣告block
  • block裡面有程式碼
  • block跟scope一樣是由外向內繼承
    1
    2
    3
    4
    5
    6
    7
    {
    const x = 1;
    const y = x+1;
    function f(){
    console.log(y);
    }
    }

var 跟 let/const 的作用範圍

  • var的作用範圍是 scope
  • let/const 的作用範圍是 block

因為var的作用範圍是scope,而非block,所以即使在block內/外都宣吿x,可是var會穿越block,導致block裡面跟外面的x會合而為一,兩次印出的結果都是2

1
2
3
4
5
6
7
8
var x = 1;
{
var x = 2;
console.log(x)
}
console.log(x);
//2
//2

同樣的例子改為let做宣告,因為let的作用範圍是block,所以程式碼由上而下執行到block中會先印出2,接著結束block之後再印出外面的1

1
2
3
4
5
6
7
8
let x = 1;
{
let x = 2;
console.log(x);
}
console.log(x);
//2
//1

在ES6出現let/const之後,let/const可以完全取代var,所以鮮少再使用var了

© 2020 Leah's Blog All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero