JavaScript的函數定義有個特點,它會先掃描整個函數體的語句,把所有申明的變數“提升”到函數頂部: 雖然是strict模式,但語句var x = 'Hello, ' + y;並不報錯,原因是變數y在稍後申明瞭。但是alert顯示Hello, undefined,說明變數y的值為undefine ...
JavaScript的函數定義有個特點,它會先掃描整個函數體的語句,把所有申明的變數“提升”到函數頂部:
'use strict'; function foo() { var x = 'Hello, ' + y; alert(x); var y = 'Bob'; } foo();
雖然是strict模式,但語句var x = 'Hello, ' + y;
並不報錯,原因是變數y
在稍後申明瞭。但是alert
顯示Hello, undefined
,說明變數y
的值為undefined
。這正是因為JavaScript引擎自動提升了變數y
的聲明,但不會提升變數y
的賦值。
對於上述foo()
函數,JavaScript引擎看到的代碼相當於:
function foo() { var y; // 提升變數y的申明 var x = 'Hello, ' + y; alert(x); y = 'Bob'; }
由於JavaScript的這一怪異的“特性”,我們在函數內部定義變數時,請嚴格遵守“在函數內部首先申明所有變數”這一規則。最常見的做法是用一個var
申明函數內部用到的所有變數:
function foo() { var x = 1, // x初始化為1 y = x + 1, // y初始化為2 z, i; // z和i為undefined // 其他語句: for (i=0; i<100; i++) { ... } }