Var、Let 和 Const的區(qū)別

var 的作用域

當(dāng) var 變量在函數(shù)外部聲明時(shí),作用域是全局的。這意味著在函數(shù)體外用 var 聲明的任何變量都可以在整個(gè)窗口中使用。
var 在函數(shù)中聲明時(shí),它的作用域是在函數(shù)體內(nèi)。這意味著它只能在該函數(shù)中被訪問。

 var greeter = "hey hi";
 function newFunction() {
       var hello = "hello";
   }

greeter 是全局作用域的,因?yàn)樗嬖谟诤瘮?shù)之外,而 hello 是函數(shù)作用域,所以我們不能在函數(shù)之外訪問變量 hello。如果我們這樣做會(huì)得到一個(gè)錯(cuò)誤,這是由于 hello 在函數(shù)之外不可用。

 var tester = "hey hi";
    
    function newFunction() {
        var hello = "hello";
    }
    console.log(hello); // error: hello is not defined

var 變量可以重新聲明和更新

這意味著我們可以在相同的作用域內(nèi)執(zhí)行此操作,并且不會(huì)出錯(cuò)。

    var greeter = "hey hi";
    var greeter = "say Hello instead";
    var greeter = "hey hi";
    greeter = "say Hello instead";

var 的問題

 var greeter = "hey hi";
    var times = 4;

    if (times > 3) {
        var greeter = "say Hello instead"; 
    }
    
    console.log(greeter) // "say Hello instead"

當(dāng) times >,greeter 被重新定義為 "say Hello instead"。如果你有意要重新定義 greeter,這不是問題,但當(dāng)你沒有意識(shí)到以為 greeter還是 "hey hi"時(shí),它就會(huì)成為問題。

引入let的作用

let 變量不能在其作用域內(nèi)重新聲明。

 let greeting = "say Hi";
 let greeting = "say Hello instead"; // error: Identifier 'greeting' has already been declared

但是,如果同一個(gè)變量定義在不同的作用域,就不會(huì)報(bào)錯(cuò):

 let greeting = "say Hi";
    if (true) {
        let greeting = "say Hello instead";
        console.log(greeting); // "say Hello instead"
    }
    console.log(greeting); // "say Hi"

因?yàn)閮蓚€(gè)實(shí)例都被視為不同的變量,因?yàn)樗鼈兙哂胁煌淖饔糜颉?br> 這樣使用 let 時(shí),如果你以前使用過(guò)變量名稱,則不必?fù)?dān)心,因?yàn)樽兞績(jī)H存在于其作用域內(nèi)。

Const

與 let 聲明一樣,const 聲明只能在它們聲明的塊內(nèi)訪問。
const 不能更新或重新聲明

    const greeting = "say Hi";
    greeting = "say Hello instead";// error: Assignment to constant variable. 
    const greeting = "say Hi";
    const greeting = "say Hello instead";// error: Identifier 'greeting' has already been declared

因此,每個(gè) const 聲明都必須在聲明時(shí)進(jìn)行初始化。
雖然無(wú)法更新 const 對(duì)象,但可以更新此對(duì)象的屬性。因此,如果我們這樣聲明一個(gè) const 對(duì)象:

    const greeting = {
        message: "say Hi",
        times: 4
    }
    greeting.message = "say Hello instead";

這三個(gè)聲明方法有以下區(qū)別:

var 聲明是全局作用域或函數(shù)作用域,而 let 和 const 是塊作用域。
var 變量可以在其作用域內(nèi)更新和重新聲明;let 變量可以更新但不能重新聲明;const 變量既不能更新也不能重新聲明。
它們都被提升到了作用域的頂部。但是,var 變量是用 undefined 初始化的,而 let 和 const 變量不會(huì)被初始化。
var 和 let 可以在不初始化的情況下聲明,而 const 必須在聲明時(shí)初始化

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容