筆記 JavaScript 中,什麼是 Scope 和全域物件。
一、前言:
開始全域物件以前,先說一下在 JavaScript 中如何界定 Scope。然後再帶到全域物件。
二、Scope:
先看看 w3school,在 JavaScript 中只有兩種 Scope:
- 一種是 function scope,或稱為 local scope:
The scope changes inside functions.
They can only be accessed within the function.
- 一種是 global scope:
All scripts and functions on a web page can access it.
意思是 JavaScript 中,是使用函數(function)切分範圍。所以變數不在函數裡,那一定在全域中。
三、全域物件(Global Object)
從 Scope 章節中得知,全域的定義是:
Not inside a Function.
不在函數內的,就叫做全域(Global)。
當 JavaScript 程式碼被執行後,JavaScript Engine 會自動建立起執行環境(Execution Context),此執行環境為全域(Global)。
執行環境(Execution Context)包含了:
- 你寫的程式碼
- 全域物件(global object)
- 特殊變數 this
『全域物件(global object)』和『特殊變數 this』都是 JavaScript Engine 建立執行環境時自動幫你建立的。
JavaScript 在不同執行環境有不同的全域物件,在瀏覽器裡,全域物件叫做 window。在 Node.js 環境中,全域物件叫做 global。全域物件可以讓執行環境內所有程式都能使用。
在瀏覽器執行環境中,全域物件 window 等同 this,兩者是相同的。
舉例來說,假設宣告 var a = 10;
,你會在全域物件(global object) window 底下找到屬性 a。
var a = 10;
console.log(window.a); // 10,全域物件 window 底下有屬性 a
console.log(this.a); // 10,this 等同全域物件 window
四、瀏覽器的全域物件下的屬性與方法:
全域物件底下有很多大家常用的屬性和方法,我條列幾個我常使用的。
屬性:
- NaN
- undefined
- infinity
方法:
- isNaN()
- isFinite()
- parseInt()
- parseFloat()
- decodeURI() / encodeURI()
- eval()
其他方法和屬性可參考 MDN - 標準內建物件。
五、保留字(Reserved Words):
另外,建立起執行環境(Execution Context)時,會有保留字(Reserved Words)不提供命名使用,可參考下面兩篇:
- MSDN - JavaScript Reserved Words
- w3school - JavaScript Reserved Words
六、參考資料:
- w3school — JavaScript Scope
- MDN — 區塊
- MDN — 標準內建物件
- w3school — JavaScript Reserved Words
- MSDN — JavaScript Reserved Words