現(xiàn)象
1. 如下代碼,將會(huì)輸出什么呢盹兢?
var n = 1;
function test () {
console.log('log1 :' + n);
var n = 2;
console.log('log2 :' + n);
}
test ();
console.log('log3 :' + n);
2. 輸出如下:
log1 :undefined
log2 :2
log3 :1
3. 解釋:
var n = 1; //全局變量
function test () {
//var n; //1.變量聲明(變量提升至函數(shù)內(nèi)首行),覆蓋全局變量聲明
console.log('log1 :' + n); //2.n現(xiàn)只聲明烹俗,未賦值
var n = 2; //3.函數(shù)作用域內(nèi)局部變量賦值
console.log('log2 :' + n); //4.調(diào)用n值輸出
}
test (); //執(zhí)行函數(shù)
console.log('log3 :' + n); //5.全局作用域下輸出n
4.函數(shù)提升
(function () {
// var fn1,function fn2 () {};//隱式聲明fn2(),只聲明fn1變量
fn2();
fn1();
var fn1 = function () {};
function fn2 () {};
}) ()
在Google控制臺(tái)中運(yùn)行此立即調(diào)用代碼時(shí)出錯(cuò)信息為>Uncaught TypeError: fn1 is not a function蛤袒,這說明函數(shù)表達(dá)式只將變量fn1提升函數(shù)提升失敗鸟蜡,而形如函數(shù)聲明fn2已在開頭隱式聲明函數(shù)提升成功。
** 說明**
1.變量如果不在全局作用域聲明那么就在函數(shù)作用域聲明豌注,變量使用表達(dá)式賦值定義時(shí)也是先聲明伤塌,調(diào)用時(shí)才賦值。
2.在函數(shù)作用域內(nèi)變量分為執(zhí)行前轧铁、執(zhí)行時(shí)每聪、執(zhí)行后,執(zhí)行前聲明變量,執(zhí)行時(shí)調(diào)用變量熊痴,執(zhí)行后若無其他調(diào)用則回收他爸。
應(yīng)用
了解上述內(nèi)容之后,編碼時(shí)需要避免變量提升這類情況果善。具體是編碼規(guī)范化,優(yōu)先在作用域內(nèi)首行聲明變量系谐,且只在一處使用必須的關(guān)鍵字var聲明變量巾陕,形如:
(function () {
var a,
b,
c;
//其他代碼
} ) ()