js 聲明變量帶var和不帶的區別


全局上下文中

  • 帶var的變量是 聲明一個全局變量,不能被delete刪除
  • 不帶var的變量是 創建一個全局對象(window)的屬性,可以用delete關鍵字刪除

函數上下文中

  • 帶var的變量是 聲明一個私有變量
  • 不帶var的變量,處理機制是
    • 沿作用域鏈向上查找該變量,是哪個上下文中聲明的變量,就改變哪個上下文中的變量
    • 如果所有上下文中都沒有該變量,則給全局對象 window,添加一個同名屬性
var num1 = 1;
delete num1;  //變量不能被刪除 
console.log("num11 = ", num1) //=>1

num2 = 2;// window 添加屬性 num2:2
// delete num2;  //屬性可以被刪除 
console.log("num21 = ", num2) //=>2  delete num2 后報錯,Uncaught ReferenceError: num2 is not defined

function model() {
    var num1 = 2; // 函數 model 私有變量
    
    num2 = 3;     // 改變全局對象 window 屬性 num2:3
    console.log("num22 = ", num2);//=>3
    console.log("window.num2 = ", window.num2);//=>3

    // 自執行匿名函數 ,只有當外層函數執行的時候,才會執行
    (function () {
        var num3 = 4; // 匿名函數私有變量 
        console.log("num31 = ", num3)//=>4

        num1 = 5; // 改變的是上級 model私有上下文中的 num1
        console.log("num12 = ", num1) //=>5
        console.log("window.num1 = ", window.num1) //=>1

        num3 = 6; // 改變的是 匿名函數私有變量 num3 
        console.log("num32 = ", num3)//=>6
        console.log("window.num3 = ", window.num3) //=> undefined

        num4 = 7 // 給全局對象 window 添加屬性 num4:7
        console.log("num41 = ", num4)//=>7
        console.log("window.num4 = ", window.num4) //=>7
    })()
    // model 私有變量
    console.log("num13 = ", num1) //=> 5
    // console.log("num33 = ", num3)//=>Uncaught ReferenceError: num3 is not defined
}
model()
// 全局變量
console.log("num14 = ", num1)//=>1
console.log("window.num1 = ", window.num1)//=>1

console.log("num42 = ", num4)//=>7
console.log("window.num4 = ", window.num4)//=>7

// console.log("num33 = ", num3)//=>Uncaught ReferenceError: num3 is not defined

// delete num2
// console.log("num23 = ", num2) // delete 之后,報錯 Uncaught ReferenceError: num2 is not defined


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM