# 全域變數/全域屬性 * 全域變數 沒有在涵式內宣告的變數「全域變數」,意思為不管在哪一個地方,都能夠呼叫這個變數。 ``` var a ='小明'; console.log(a);//小明 console.log(window); // window物件也是瀏覽器執行時的全域物件 ``` ![](https://hackmd.io/_uploads/Sy_xxKjo2.png) 在涵式內宣告的變數,只會存在該作用域中,反之在外面宣告的話,就會變成「全域變數」。 ``` function fn () { var a = '小明' console.log(a); console.log(window); } fn() ``` ![](https://hackmd.io/_uploads/HJgZBFsi3.png) * 全域屬性 沒用var宣告,而是直接把'小明'的值賦予給a變數上 「a」不是全域變數,是wnidow物件下的一個屬性 ``` function fn () { a = '小明' } fn() ``` ![](https://hackmd.io/_uploads/H18yEKsoh.png) --- ## 1.核心實戰題-為什麼變數需要被宣告 避免變成全域window的屬性(有人稱為「全域變數」,更準確說法為全域window的屬性。 因為作用域關係,每個涵式與作用域都可以取得window,意思為window下的屬性都是可以被取得。 ``` function fn () { a = '小明' } function fn2 () { console.log(a); // 小明 } fn() fn2() ``` 避免造成「命名上的衝突」,使原始變數被不正常覆蓋或者修改調整。 有可能在後面涵式中,不小心使用到一樣的變數名,因此把前面的變數給覆蓋掉,造成問題。 ## 2.核心實戰題-變數與屬性的差異為何? * delete 運算子 將物件中的屬性刪除,示範: ``` var obj = { a:'小明', }; delete obj.a; console.log(a)//undefined ``` 驗證過程如下: 1. 不宣告,並將'小明'賦予給a,意味著在window物件新增a屬性,使用delete可以刪除該屬性。 ``` a = '小明'; delete a; console.log(window.a)undefined console.log(a)Uncaught ReferenceError: a is not defined ``` 2. 當宣告,var所宣告的變數是無法被刪除的,window.a 或 直接取得a,皆無受影響。 ``` var a ='小明'; delete a; console.log(window.a) // 小明 console.log(a)// 小明 ``` --- ### 重點 > 為宣告的變數實質為全域window屬性,可以使用delete刪除它; > 在全域環境使用var宣告,則為全域變數,delete 無法刪除它。 ## 下一站 [1-2變數的語法作用域](https://hackmd.io/@KFqiBO5dTA2-3EAj3rqZQg/S1elkqjin)