最近在看es6,就記錄一下筆記好供往後參考。es6
衆所周知在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
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
(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
今天就先記錄到這裏,之後持續更新~~