JS Day 37: Var, Let and Const

有 N 人看过
  • var:宣告變數
  • let :宣告只作用在當前區塊的變數
  • const:宣告常數

var & let

{
  var a = 'A';
  let b = 'B';
    const c = 'C';
}
console.log('var a: ' + a);
console.log('let b: ' + b);
console.log('let c: ' + c);

// output
// "var a: A"
// ReferenceError: b is not defined
// ReferenceError: c is not defined

var 來宣告一個全域變數,let & const 的作用域僅 scope 限於 { ... } 區塊。

作用域 (Scope)

  • var: function { }
  • let: block
// var
function varTest() {
  var x = 1;
  {
    var x = 2; // 覆蓋掉上方的 1
    console.log(x);  // 2
  }
  console.log(x);  // 2
}

// let
function letTest() {
  let x = 1;
  {
    let x = 2;  // 跟上方的 let x = 1; 不相干
    console.log(x);  // 2
  }
  console.log(x);  // 1
}

var 作用範圍是「整個」function。

for loop 作用域

for (let i = 0; i < 5; i++) {
    console.log(i);
};

console.log(i);

// output
// 1
// 2
// 3
// 4
// ReferenceError: i is not defined

let i 在 for loop 裡頭才有計次效用,在 { ... } 外呼叫會得到 ReferenceError 錯誤, i 並沒有被宣告。

for (var i = 0; i < 5; i++) {
  // var 全域
    console.log(i);
};

console.log(i);

// output
// --- LOOP 開始
// 0
// 1
// 2
// 3
// 4
// --- LOOP 結束
// 5   { ... } 外面呼叫 i 得到的結果

一樣意思, 使用 var 的話 setTimeout 取到的 iwindow.ii = 10

for (var i = 0; i < 10; i++) {  
  // var 全域
  console.log('for loop 的 i: ' + i);

  setTimeout( function() {
    console.log('第' + i + '次');
  }, 1000);
}
console.log('i 是 ' + i);

上下兩者的執行結果是一樣的

for (var i = 0; i < 10; i++) {  
  // var 全域
  console.log('for loop 的 i: ' + i);
}
console.log('i 是 ' + i);

setTimeout( function() {
  console.log('第' + i + '次');
}, 1000);

var 改成 let

for (let i = 0; i < 10; i++) {  
  // let 作用域是 block
  console.log('for loop 的 i: ' + i);

  setTimeout( function() {
    console.log('第' + i + '次');
  }, 1000);
}
console.log('i 是 ' + i);

setTimeout 取到的 i 值是 block 裡頭的 i = 9, function scope 外則是 not defined。

switch 作用域

switch (x) {
  case 0:
    let foo;
    break;

  case 1:
    let foo; // SyntaxError for redeclaration.
    break;
}

switch 的作用域為整個 switch (綠色框框),裡面重複宣告 let foo 會出現 Syntax Error: redeclaration of let foo。

重複宣告

var a = 0;
var a = 1;
var a = 2;
console.log(a); // 2

var 可以重複宣告。

let a = 0;
let a = 1;
console.log(a); // SyntaxError: redeclaration of let a

在 switch 作用域 有提到,let 無法重複宣告。

// 那這樣子呢?
var a = 0;
let a = 1;
console.log(a); // SyntaxError: redeclaration of var a

a 已經被宣告過了, let 不允許再次宣告。

const

確定不會重新宣告一個 變數 時,使用 const。

const a = 10;
const name = 'Bob';

// 重新賦予值
a = 20; // TypeError: invalid assignment to const 'a'
name = 'Will';  // TypeError: invalid assignment to const 'name'

一定要賦予值

const 要宣告一個常數,之後不能夠再修改了,所以在一開始一定要賦予值給它。

var a;
let b;
const c;  // SyntaxError: missing = in const declaration

Reference:
ECMAScript 6 入門: let 和 const 命令
重新認識 JavaScript: Day 10 函式 Functions 的基本概念
我知道你懂 hoisting,可是你了解到多深?

本作品采用 知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议 进行许可。