ECMAScript6的學習筆記之var,let,const

最近在看es6,就記錄一下筆記好供往後參考。es6

1.變量聲明 var

衆所周知在es6以前js的變量沒有塊級,只存在函數內外訪問之分;
例如:函數

var a = 5;
if(true){
  var b = 3;
  console.log(a) // 5;
  var a = 's';
}
console.log(a) // s;
console.log(b) // 3;

從上面的代碼能夠知道var定義的a在if語句塊中同樣能夠被訪問和修改,一樣在if語句塊裏面定義的變量b,在其快外面也同樣能夠被訪問和修改;因此在es6以前用var定義聲明一個變量時不會存在if,for這些語句塊的做用域。
接下來看一下es6中新增的變量聲明let;es5

2.變量聲明let

let也是用來聲明變量的,可是所聲明的變量,只在let命令所在的代碼塊內有效。
例如:code

if(true){
  let b = 3;
  console.log(b) // 3;
  var a = 's';
}
console.log(a) // s;
console.log(b) //報錯 b is not defined;

也就是在if語句塊中用let定義的變量b,出了這個區域塊就無法獲取到b了,這和var就不同了;根據這一特性申明很適合在for循環塊中申明變量;舉一個es5的一個常見問題:作用域

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

在上面的代碼中i是被var定義的沒有語句塊的限制,當循環結束後他的值被累加到6了,當你再去調用函數去訪問i時,無論是arr[3]仍是arr[4]或者其餘的獲得的都會是6;由於它的值在循環結束後已經更新爲6了;下面若是咱們改爲let聲明i會怎樣呢?io

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

獲得的結果是咱們想要的.console

3.變量常量聲明const

(1)const 聲明的是常量,一旦聲明,值將是不可變的for循環

const PI = 3.1415;
PI = 3;// 拋出異常:Assignment to constant variable.不能給一個常量再賦值;
console.log(PI) //3.1415

(2) const 也具備塊級做用域function

if (true) {
  const a = 5;
}
console.log(a);// a is not defined;

(3) const聲明的常量沒有聲明提早的效果,也不能被重複聲明;變量

var a = 5;
    function b(){
       console.log(a);
       var a = 5;
    }
    b();//undefind 這裏獲得的undefined就是由於函數內部有var聲明提早形成的;這個例子是題外話,一個比較常見的陷阱
    
    if(true){
       console.log(PI);// 拋出一個錯誤PI is not defined
       const PI = 3.14
    }
    if(true){
       console.log(PI);// 不會報錯只會打印出undefined,說明他已經聲明瞭只是沒有賦值
       var PI = 3.14 
    }
    //重複聲明
    var message = "Hello";
    const message = "Goodbye!"; //會報錯  Identifier 'message' has already been declared

今天就先記錄到這裏,之後持續更新~~

相關文章
相關標籤/搜索