程式設計中,變數的作用域(Scope) 是每位開發者都應熟悉的重要概念。不同語言在變數的可見範圍與修改規則上各有不同,理解這些差異有助於避免意外的錯誤與除錯困難。本文將帶你比較三種常見語言——R、Python 與 JavaScript——在全域與區域變數上的行為,並展示各自修改全域變數的正確方式。
一、基本概念:什麼是全域與區域變數?
- 全域變數(Global Variable):在程式的所有區塊中都可被存取與使用。
- 區域變數(Local Variable):只存在於函式或區塊內,外部無法直接存取。
雖然概念相同,但三種語言在作用域的細節與修改規則上存在顯著差異。
二、R 語言中的變數作用域
R 採用 詞法作用域(Lexical Scoping)。當你在函式中使用變數時,R 會沿著「函式的定義位置」向外尋找變數,而非呼叫位置。範例:區域與全域變數
x <- 10 # 全域變數
add_five <- function() {
x <- 5 # 區域變數
x + 5
}
add_five() # 輸出 10
x # 全域仍是 10
修改全域變數的方法
若要在函式中修改全域變數,需使用 <<- 運算子:
x <- 10
add_global <- function() {
x <<- x + 5 # 修改全域變數
}
add_global()
x # 現在為 15
💡 小技巧:<<- 會往上層環境尋找同名變數並修改它,若找不到會在全域環境中建立新變數。三、Python 的變數作用域
Python 使用 LEGB 規則(Local → Enclosing → Global → Built-in) 來決定變數搜尋的順序。
範例:區域變數遮蔽全域變數
x = 10 # 全域變數
def add_five():
x = 5 # 區域變數
return x + 5
print(add_five()) # 10
print(x) # 全域仍是 10
修改全域變數的方法
若要在函式內修改全域變數,需使用 global 關鍵字:
x = 10
def add_global():
global x
x = x + 5
add_global()
print(x) # 15
⚠️ 注意:若沒有使用 global,Python 會自動將函式內的同名變數視為新的區域變數。四、JavaScript 的變數作用域
JavaScript 在 ES6 之後區分了三種宣告方式:var、let、const,其中:
var有 函式作用域(function scope)let與const則有 區塊作用域(block scope)
範例:全域與區域變數
var x = 10; // 全域變數
function addFive() {
let x = 5; // 區域變數
return x + 5;
}
console.log(addFive()); // 10
console.log(x); // 10
修改全域變數的方法
在函式中,若想修改全域變數,直接操作同名變數即可(只要不是用 let 或 const 重新宣告):
var x = 10;
function addGlobal() {
x = x + 5; // 修改全域變數
}
addGlobal();
console.log(x); // 15
但若使用 let 或 const 定義在模組中(如 Node.js 環境),全域變數不會自動掛在 window 或 globalThis,此時可明確使用:
globalThis.x = 10;
function addGlobal() {
globalThis.x += 5;
}
addGlobal();
console.log(globalThis.x); // 15
五、三者比較總覽

六、結語:理解作用域,避免意外錯誤
作用域的差異看似細微,但卻是程式邏輯中極易出錯的部分。
- R 中,請小心使用
<<-,避免意外改動父層變數; - Python 中,別忘了
global關鍵字; - JavaScript 中,謹慎選擇
var、let或const,確保作用域清晰。
- R 中,請小心使用
掌握這些細節,你將能寫出更穩定、可預測且易於維護的程式。



















