JavaScript 變數與常數

深入探討 JavaScript 變數與常數

October 9, 2024

什麼是變數?

變數是一個可以儲存值的儲存位置。在執行過程中可以更改其值。 在 JavaScript 中,我們可以使用 var、let 或 const 來宣告變數。在現代 JavaScript 中,使用 let 和 const 來宣告變數是較推薦的選擇。

var age = 23;
age = 24;
 
let height = 1.59;
height = 1.62;

什麼是常數?

常數與變數類似,但一旦賦值後,其值就不能更改。

const PI = 3.14;
PI = 3.14159; // This will throw an error

主要差異:

作用域

Let 和 Const 宣告

let 和 const 宣告定義的變數受限於目前執行環境的詞法環境(LexicalEnvironment)。

Variable 陳述式

var 陳述式宣告的變數受限於目前執行環境的變數環境(VariableEnvironment)。

詞法環境(LexicalEnvironment)

// Block-scoped
function greeting() {
  ...
};
 
if(true) {
...
} else {
...
};
 
for(...) {
...
}

變數環境(VariableEnvironment)

詞法環境和變數環境的主要差異

讓我們實際練習並回顧我們在本文中提到的概念。

function testScope() {
  var a = 1;
  let b = 2;
  const c = 3;
 
  if (true) {
    var a = 4;
    let b = 5;
    const c = 6;
    console.log(a); // ?
    console.log(b); // ?
    console.log(c); // ?
  }
 
  console.log(a); // ?
  console.log(b); // ?
  console.log(c); // ?
}
 
testScope();

答案

function testScope() {
  var a = 1;
  let b = 2;
  const c = 3;
 
  if (true) {
    var a = 4;
    let b = 5;
    const c = 6;
    console.log(a); // 4
    console.log(b); // 5
    console.log(c); // 6
  }
 
  console.log(a); // 4
  console.log(b); // 2
  console.log(c); // 3
}
 
testScope();

解釋

在這個 testScope 函式中,變數 a 在 if 陳述式內從 1 修改為 4。這就是為什麼當我們 console.log(a) 時,答案是 4 而不是 1,因為 a 是由 變數環境 管理的,它存在於整個函式作用域中。 想像當我們使用 var 宣告變數時,它可以訪問每個房間 (函式作用域和區塊作用域)。 另一方面,使用 let 和 const 宣告變數意味著它們由 詞法環境 管理。我們可以把這想像成有兩個房間:第一組 b 和 c 存在於函式作用域的房間中,第二組 b 和 c 存在於 if 陳述式的房間中 (區塊作用域)。 因此,當我們在 if 區塊內 console.log(b) 和 console.log(c) 時,值分別是 5 和 6,因為它只能訪問 if 陳述式內的值。當我們嘗試在 if 陳述式外部 console.log(b) 和 console.log(c) 時,它可以訪問函式作用域內的值,但不能訪問存在於 if 陳述式內的值。

回到部落格 🏃🏽‍♀️