1. 程式人生 > >var,let,const區別

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用途

為了防止意外修改變數,比如引入庫名,元件名。