---
# System prepended metadata

title: 1-1變數宣告
tags: [JavaScript知識點/面試, 變數與作用域]

---

# 全域變數/全域屬性

* 全域變數
    沒有在涵式內宣告的變數「全域變數」，意思為不管在哪一個地方，都能夠呼叫這個變數。
```
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)