在JavaScript中,無論定義在何處,所有變量和函數(shù)聲明都將移動(dòng)或提升到其當(dāng)前作用域的頂部。這是JavaScript解釋器的默認(rèn)行為,稱為hoisting(提升)。
使用函數(shù)聲明定義的函數(shù)會(huì)自動(dòng)提升。
這意味著可以在定義它們之前調(diào)用它們。
// 在聲明之前調(diào)用函數(shù) greet(); function greet() { document.getElementById("output").innerHTML = "Hello World"; }測(cè)試看看?/?
正如您看到的,在定義之前,我們已經(jīng)調(diào)用了greet()函數(shù),但是代碼仍然有效。這是因?yàn)楹瘮?shù)聲明在后臺(tái)自動(dòng)提升到頂部。
提升是JavaScript將聲明移到頂部的默認(rèn)行為。
JavaScript僅提升聲明,而不提升初始化。如果在使用變量后聲明并初始化了變量,則該值將是不確定的。
document.write(num); // undefined var num; num = 50;測(cè)試看看?/?
如果在使用變量后聲明該變量,但事先對(duì)其進(jìn)行了初始化,它將返回該值:
num = 50; document.write(num); // 50 var num;測(cè)試看看?/?
JavaScript僅提升聲明,而不提升初始化。
以下兩個(gè)示例產(chǎn)生不同的結(jié)果:
var x = 1; // 初始化 x var y = 2; // 初始化 y document.write(x + " " + y); // 1 2測(cè)試看看?/?
var x = 1; // 初始化 x document.write(x + " " + y); // 1 undefined var y = 2; // 初始化 y測(cè)試看看?/?
在示例2中,僅將聲明(var y)而不是初始化(= 2)提升到頂部。
由于提升,已在使用y之前聲明了y,但由于未提升初始化,因此y的值未定義。
上面的示例被隱式理解為:
var x; // 聲明 x var y; // 聲明 y // 提升結(jié)束. x = 1; // 初始化 x document.write(x + " " + y); // 1 undefined y = 2; // 初始化 y測(cè)試看看?/?
提升(Hoisting)是JavaScript的未知或被忽略的行為。
如果您不懂提升(Hoisting),程序可能包含錯(cuò)誤。
為避免錯(cuò)誤,請(qǐng)始終在每個(gè)作用域的開頭聲明所有變量。
注意:如果未聲明變量,則嚴(yán)格模式下的JavaScript不允許使用變量。
您將"use strict"在下一章中了解更多信息。