JavaScript的一個特性之一是,你可以稍后引用定義的變量,而不會發(fā)生異常。
這一現(xiàn)象被稱為變量聲明提升(hoisting),聲明后得到的變量是undefined 值。
所以即使在引用或使用某個變量后存在初始化和聲明操作,得到的仍將是undefined值。
console.log(a)
var a=3
undefined
等效于
var a;
console.log(a)
a = 3;
####順便說下let 和 var 的區(qū)別
通過var定義的變量,作用域是整個封閉函數(shù),是全域的 。通過let定義的變量,作用域是在塊級或是子塊中。
for (let i = 0; i < 10; i++) {
// ...
}
console.log(i);
// ReferenceError: i is not defined
//計數(shù)器i只在for循環(huán)體內(nèi)有效,在循環(huán)體外引用就會報錯。
-不論var聲明的變量處于當(dāng)前作用域的第幾行,都會提升到作用域的頭部。
-var 聲明的變量會被提升到作用域的頂部并初始化為undefined,而let聲明的變量在作用域的頂部未被初始化
// let 的情況
console.log(bar); // 報錯ReferenceError
let bar = 2;
//相當(dāng)于在第一行先聲明bar但沒有初始化,直到賦值時才初始化