javascript變量聲明提升(hoisting)

Java Script Hoisting


java script的變量聲明具有hoisting機制梢褐,JavaScript引擎在執(zhí)行的時候彻犁,會把所有變量的聲明都提升到當前作用域的最前面绰更。


先看一段代碼

var v ="hello";

(function(){

console.log(v);

var v ="world";

})();

這段代碼運行的結果是什么呢姨蟋?

答案是:undefined

這段代碼說明了兩個問題憨降,

第一,function作用域里的變量v遮蓋了上層作用域變量v母赵。代碼做少些變動

var v ="hello";

if(true){

console.log(v);

var v ="world";

}

輸出結果為”hello”,說明java script是沒有塊級作用域的逸爵。函數(shù)是JavaScript中唯一擁有自身作用域的結構。

第二凹嘲,在function作用域內师倔,變量v的聲明被提升了。所以最初的代碼相當于:

var v ="hello";

(function(){

var v; ? ? ? ? ? ? ?//declaration hoisting

console.log(v);

v ="world";

})();


聲明周蹭、定義與初始化

聲明宣稱一個名字的存在趋艘,定義則為這個名字分配存儲空間,而初始化則是為名字分配的存儲空間賦初值凶朗。

用C++來表述這三個概念

externinti;//這是聲明瓷胧,表明名字i在某處已經(jīng)存在了

inti;//這是聲明并定義名字i,為i分配存儲空間

i = 0;//這是初始化名字i,為其賦初值為0

javascript中則是這樣

var v;//聲明變量v

v ="hello";//(定義并)初始化變量v

因為 java script為動態(tài)語言,其變量并沒有固定的類型棚愤,其存儲空間大小會隨初始化與賦值而變化搓萧,所以其變量的“定義”就不像傳統(tǒng)的靜態(tài)語言一樣了,其定義顯得無關緊要宛畦。


聲明提升

當前作用域內的聲明都會提升到作用域的最前面瘸洛,包括變量和函數(shù)的聲明

(function(){

var a ="1";

var f =function(){};

var b ="2";

var c ="3";

})();

變量a,f,b,c的聲明會被提升到函數(shù)作用域的最前面,類似如下:

(function(){

var a,f,b,c;

a ="1";

f =function(){};

b ="2";

c ="3";

})();

請注意函數(shù)表達式并沒有被提升次和,這也是函數(shù)表達式與函數(shù)聲明的區(qū)別货矮。進一步看二者的區(qū)別:

(function(){

//var f1,function f2(){}; //hoisting,被隱式提升的聲明

f1();//ReferenceError: f1 is not defined

f2();

var f1 =function(){};

functionf2(){}

})();

上面代碼中函數(shù)聲明f2被提升,所以在前面調用f2是沒問題的斯够。雖然變量f1也被提升囚玫,但f1提升后的值為undefined,其真正的初始值是在執(zhí)行到函數(shù)表達式處被賦予的。所以只有聲明是被提升的读规。


名字解析順序

javascript中一個名字(name)以四種方式進入作用域(scope)抓督,其優(yōu)先級順序如下:

1、語言內置:所有的作用域中都有 this 和 arguments 關鍵字

2束亏、形式參數(shù):函數(shù)的參數(shù)在函數(shù)作用域中都是有效的

3铃在、函數(shù)聲明:形如function foo() {}

4、變量聲明:形如var bar;

名字聲明的優(yōu)先級如上所示碍遍,也就是說如果一個變量的名字與函數(shù)的名字相同定铜,那么函數(shù)的名字會覆蓋變量的名字,無論其在代碼中的順序如何怕敬。但名字的初始化卻是按其在代碼中書寫的順序進行的揣炕,不受以上優(yōu)先級的影響《颍看代碼:

(function(){

var foo;

console.log(typeoffoo);//function

function foo(){}

foo ="foo";

console.log(typeoffoo);//string

})();

如果形式參數(shù)中有多個同名變量畸陡,那么最后一個同名參數(shù)會覆蓋其他同名參數(shù)鹰溜,即使最后一個同名參數(shù)并沒有定義。

以上的名字解析優(yōu)先級存在例外丁恭,比如可以覆蓋語言內置的名字arguments曹动。

命名函數(shù)表達式

可以像函數(shù)聲明一樣為函數(shù)表達式指定一個名字,但這并不會使函數(shù)表達式成為函數(shù)聲明牲览。命名函數(shù)表達式的名字不會進入名字空間墓陈,也不會被提升。

f();//TypeError: f is not a function

foo();//ReferenceError: foo is not defined

var f =function foo(){console.log(typeof foo);};

f();//function

foo();//ReferenceError: foo is not defined

命名函數(shù)表達式的名字只在該函數(shù)的作用域內部有效第献。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末贡必,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子痊硕,更是在濱河造成了極大的恐慌,老刑警劉巖押框,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岔绸,死亡現(xiàn)場離奇詭異,居然都是意外死亡橡伞,警方通過查閱死者的電腦和手機盒揉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兑徘,“玉大人刚盈,你說我怎么就攤上這事」夷裕” “怎么了藕漱?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長崭闲。 經(jīng)常有香客問我肋联,道長,這世上最難降的妖魔是什么刁俭? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任橄仍,我火速辦了婚禮,結果婚禮上牍戚,老公的妹妹穿的比我還像新娘侮繁。我一直安慰自己,他們只是感情好如孝,可當我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布宪哩。 她就那樣靜靜地躺著,像睡著了一般第晰。 火紅的嫁衣襯著肌膚如雪斋射。 梳的紋絲不亂的頭發(fā)上育勺,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機與錄音罗岖,去河邊找鬼涧至。 笑死,一個胖子當著我的面吹牛桑包,可吹牛的內容都是我干的南蓬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼哑了,長吁一口氣:“原來是場噩夢啊……” “哼赘方!你這毒婦竟也來了?” 一聲冷哼從身側響起弱左,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤窄陡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拆火,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體跳夭,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年们镜,在試婚紗的時候發(fā)現(xiàn)自己被綠了币叹。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡模狭,死狀恐怖颈抚,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情嚼鹉,我是刑警寧澤贩汉,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站锚赤,受9級特大地震影響雾鬼,放射性物質發(fā)生泄漏。R本人自食惡果不足惜宴树,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一策菜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧酒贬,春花似錦又憨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至零如,卻和暖如春躏将,著一層夾襖步出監(jiān)牢的瞬間锄弱,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工祸憋, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留会宪,地道東北人。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓蚯窥,卻偏偏與公主長得像掸鹅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子拦赠,可洞房花燭夜當晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內容