[javascript] 變數提升
阿新 • • 發佈:2021-01-11
摘自廖雪峰網站
JavaScript的函式定義有個特點,它會先掃描整個函式體的語句,把所有申明的變數“提升”到函式頂部:
'use strict'; function foo() { var x = 'Hello, ' + y; console.log(x); var y = 'Bob'; } foo();
雖然是strict模式,但語句var x = 'Hello, ' + y;並不報錯,原因是變數y在稍後申明瞭。但是console.log顯示Hello, undefined,說明變數y的值為undefined。這正是因為JavaScript引擎自動提升了變數y的宣告,但不會提升變數y的賦值 。
對於上述foo()函式,JavaScript引擎看到的程式碼相當於:
function foo() { var y; // 提升變數y的申明,此時y為undefined var x = 'Hello, ' + y; console.log(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++) { ... } }