過程中會用到如 if-else 或 for loop,形成一個個 Block (如 Block A、Block B)。
漸漸地,我們會把一些程式片段包裝成函數,形成 Function 區塊 (如 myFunc1()、myFunc2()),而函數內又可能再形成小 Block。
對應到實際的程式碼,會類似以下:
/* Global Execution Context (outside of any function) */
var i;
console.log(i);
// Block A
if(true){
.......
}
// Block B
for( i = 0 ; i < 5 ; i ++){
.......
}
function myFunc1(){
..........
// Block C
if(true){
........
}
// Block D
if(true){
.........
}
}
function myFunc2(){
..........
// Block E
if(true){
........
}
// Block F
if(true){
.........
}
}
以下會用實際的程式碼情境,配合程式結構圖片來說明各種 Scope 的有效範圍。
Example 1:宣告在 Function 內 (使用 var、let、const 都一樣)
function myFunc(){
var n1 = "OneJar";
console.log("myFunc(): typeof n1=", typeof n1, " value=", n1);
}
myFunc();
console.log("Global: typeof n1=", typeof n1); // 這裡 n1 只能印 type 不能印值,否則會拋 `ReferenceError: n1 is not defined`
執行結果:
myFunc(): n1= OneJar
Global: typeof n1= undefined
紅色是 n1 宣告的地方,淺藍色部分就是 n1 的 Scope。
基本 Function Scope。
只有在自己這個 function 內有效,包含 function 內的子 Block。
別的 function 不認得。
主程式區也不認得。
Example 2:宣告在主程式區 (使用 var)
function myFunc(){
console.log("myFunc(): n1=", n1);
console.log("myFunc(): this.n1=", this.n1);
console.log("myFunc(): window.n1=", window.n1);
}
var n1 = "OneJar";
myFunc();
console.log("Global: n1=", n1);