var,let,const區別
let 和 const 是ES6中新增用來定義變數的。
var
var語句用來宣告JavaScript變數,在學習JS入門最基礎瞭解的知識,也就是在ES5階段,所有變數的宣告都是用var。
var a=1;
alert(a);
let
let同樣是用來定義變數。
let a=1;
alert(a);
var 和 let 區別
既然 var 和 let 都是用來定義變數,那麼它們之間必然是存在區別,否則ES6中何故新增這一用法。
1、let 自帶塊級作用域,它作用於程式碼塊中,{}包含起來的就是程式碼塊,而這也就形成了一個作用域。因此 let 只能在程式碼塊中使用。然而 var 只有函式作用域。
{
var a=1;
}
alert(a);
var 宣告的變數在程式碼塊中,外部呼叫這個變數仍然可以使用。
{
let a=1;
}
alert(a);
let 宣告的變數在程式碼塊外呼叫就會報錯,提示a沒有被定義,這就說明了 let 只能在程式碼塊中使用。
2、var 宣告的變數可以重複,但是 let 不允許重複宣告。
var a=1;
var a=2;
alert(a);
顯然這是正確的,後一個宣告的 a 覆蓋了之前的,返回結果就是 2。
let a=1;
let a=2;
alert(a);
會提示報錯,“Identifier 'a' has already been declared”。
let 用途
正是因為 let 有塊級作用域,這便簡化了ES5中封閉空間的實現。那先回顧一下所謂的封閉空間。JavaScript 中沒用私有作用域的概念,如果在多人開發的專案上,你在全域性或區域性作用域中聲明瞭一些變數,可能會被其他人不小心用同名的變數給覆蓋掉,根據javascript函式作用域鏈的特性,可以使用這種技術可以模仿一個私有作用域,用匿名函式作為一個“容器”,“容器”內部可以訪問外部的變數,而外部環境不能訪問“容器”內部的變數,所以( function(){…} )()內部定義的變數不會和外部的變數發生衝突,俗稱 “匿名包裹器” 或 “名稱空間”。這也就是立即執行函式的用途。
(function(){
var a=1;
})()
alert(a);
如上就是一個很簡單的模擬私有作用域,在外部呼叫 a 則會報錯未定義,然而這樣的形式太過複雜,有了 let 則會簡便很多。譬如,設定三個按鈕,不同編號,在點選按鈕會彈出相應的編號。
<input type="button" value="按鈕1">
<input type="button" value="按鈕2">
<input type="button" value="按鈕3">
<script>
var btn = document.getElementsByTagName("input");
for(var i=0; i<btn.length; i++){
(function(i){
btn[i].onclick=function(){
alert("按鈕"+parseInt(i+1));
}
})(i)
}
</script>
這裡就用到了立即執行函式,也就是在for迴圈中增加了( function(){…} )()這樣的寫法。用 let 就會簡單多了,相當於替代了理解執行函式的用法。
var btn = document.getElementsByTagName("input");
for(let i=0; i<btn.length; i++){
btn[i].onclick=function(){
alert("按鈕"+parseInt(i+1));
}
}
const
const用來定義常量。一旦賦值,以後再也無法修改。
const a=1;
a=2; //報錯
並且,const宣告時必須給初始值, 不能重複宣告。
const a;
a=1; //報錯
const a=1;
const a=2; //報錯
const用途
為了防止意外修改變數,比如引入庫名,元件名。