因為習慣用var聲明變量,以至於ES6出了let來替代var,我依然繼續用var,直到后來慢慢了解let之后,開始嘗試使用
不同點:
①:var屬於ES5規范,let屬於ES6規范
②:var有預處理機制,let沒有。預處理機制也就是常說的聲明提前
聲明提前:不管變量被聲明在函數什么位置,所有變量聲明都會被提升至函數頂部(變量聲明指 var a; 即聲明還未賦值)
比如聲明變量a並賦值為1,即 var a = 1; 則 var a;會被提升至函數頂部 (只是a被提前,a的值1不會被提前)
注:1. 在聲明變量時一定要初始化 ,初始化指 var a = 1; (聲明並賦值 )
2. 即使在函數內部,聲明變量時一定要加上var,不要只寫 a = 1; 否則變量a會自動升為全局變量
下面立即函數執行后,控制台不會打印出1,而是undefined,因為只有聲明被提前,值沒有
<script> (function() { console.log(a); var a = 1; })() </script>
下面立即執行函數執行后,控制台不會打印出1和undefined,而是報錯,因為let聲明的變量不會被提前
<script> (function() { console.log(a); let a = 1; })() </script>
③:作用域的不同,var是全局作用域,let是塊級作用域
下面代碼控制台會打印出1
<script> if(true) { var a = 1; } console.log(a); </script>
下面代碼控制台不會打印出1,會報錯,提示a沒有定義(let定義的變量只在{}里才能訪問到)
<script> if(true) { var let = 1; } console.log(a); </script>