javascript變量聲明提升

遇到了JS的變量聲明提升,英文名為Hosting,具體來(lái)講是指JS在對(duì)當(dāng)前作用域中的聲明代碼孩擂,會(huì)將其提升至當(dāng)前作用域的最頂端。本文通過(guò)幾個(gè)示例來(lái)詳細(xì)理解一下:

示例一

  • 正常預(yù)期的輸出
var myvar = 'my value'; 
  
(function() { 
  alert(myvar); 
})();

這種情況下箱熬,在瀏覽器中執(zhí)行类垦,會(huì)看到 my value 的提示框。

  • 異常不符合預(yù)期的輸出
var myvar = 'my value'; 
  
(function() { 
  alert(myvar);
  var myvar = 'local value'; 
})();

這時(shí)城须,我們確得到的輸出資料是 undefined 蚤认。并不是全局的 myvar,這就是因?yàn)樵趂unction的作用域內(nèi)糕伐,將變量myvar的聲明提升至 alert的上方砰琢,等同于下面的代碼:

var myvar = 'my value'; 
  
(function() { 
  var myvar;
  alert(myvar);
  myvar = 'local value'; 
})();

示例二

(function (){
   newFuntion();
   var newFuntion = function(){
      alert("hello word");
   }
})();

這段代碼將不會(huì)有任何輸出,但會(huì)得到一個(gè)錯(cuò)誤信息良瞧,Uncaught TypeError: newFuntion is not a function陪汽。可以看出褥蚯,其也會(huì)對(duì)函數(shù)的變量聲明也會(huì)進(jìn)行提升挚冤,等同于這段代碼:

(function (){
   var newFuntion; 
   newFuntion();
   newFuntion = function(){
      alert("hello word");
   }
})();

但是,這樣調(diào)用就不會(huì)出錯(cuò):

(function (){
   newFuntion();
   function newFuntion(){
      alert("hello word");
   }
})();

這是函數(shù)聲明的寫法赞庶,會(huì)優(yōu)先在當(dāng)前作用域進(jìn)行函數(shù)的注冊(cè)你辣,所以調(diào)用的時(shí)候,函數(shù)已經(jīng)存在尘执,沒(méi)有問(wèn)題舍哄。

示例三

var a = 1;  
function b() {  
    a = 10;  
    return;  
    function a() {} 
}  
b();  
alert(a);

這個(gè)示例的輸出,給我們的結(jié)果是個(gè)"1"的彈出框誊锭,很困惑了有木有表悬?對(duì)代碼改動(dòng)一下,

var a = 1;  
function b() {  
    alert(a);
    a = 10;  
    return;  
    function a() {} 
}  
b();  

得到的a 是function a(){}丧靡。得到的結(jié)果是其對(duì)函數(shù)的聲明蟆沫。需要注意的是,這里在function b下面的a因?yàn)楹瘮?shù)聲明的問(wèn)題温治,已經(jīng)變?yōu)榱艘粋€(gè)局部變量饭庞,所以不會(huì)影響全局變量a,所以之前代碼的結(jié)果輸出為1熬荆,也就很容易理解了舟山。

總結(jié)

變量聲明的時(shí)候,變量賦值并沒(méi)有被提升,只是聲明被提升了累盗。但是寒矿,同時(shí)要注意函數(shù)聲明與函數(shù)表達(dá)式的區(qū)別: 函數(shù)聲明會(huì)在當(dāng)前作用域優(yōu)先進(jìn)行注冊(cè),會(huì)產(chǎn)生覆蓋的效果若债,而函數(shù)表達(dá)式則是按代碼順序進(jìn)行執(zhí)行 符相。所以下面這段也就容易理解了:

function test() {  
    foo(); // TypeError "foo is not a function"  
    bar(); // "this will run!"  
    var foo = function () { // 變量指向函數(shù)表達(dá)式  
        alert("this won't run!");  
    }  
    function bar() { // 函數(shù)聲明 函數(shù)名為bar  
        alert("this will run!");  
    }  
}  
test();

參考資料

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市蠢琳,隨后出現(xiàn)的幾起案子啊终,更是在濱河造成了極大的恐慌,老刑警劉巖傲须,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蓝牲,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡躏碳,警方通過(guò)查閱死者的電腦和手機(jī)搞旭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)菇绵,“玉大人肄渗,你說(shuō)我怎么就攤上這事∫ё睿” “怎么了翎嫡?”我有些...
    開(kāi)封第一講書人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)永乌。 經(jīng)常有香客問(wèn)我惑申,道長(zhǎng),這世上最難降的妖魔是什么翅雏? 我笑而不...
    開(kāi)封第一講書人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任圈驼,我火速辦了婚禮,結(jié)果婚禮上望几,老公的妹妹穿的比我還像新娘绩脆。我一直安慰自己,他們只是感情好橄抹,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布靴迫。 她就那樣靜靜地躺著,像睡著了一般楼誓。 火紅的嫁衣襯著肌膚如雪玉锌。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 50,084評(píng)論 1 291
  • 那天疟羹,我揣著相機(jī)與錄音主守,去河邊找鬼禀倔。 笑死,一個(gè)胖子當(dāng)著我的面吹牛丸逸,可吹牛的內(nèi)容都是我干的蹋艺。 我是一名探鬼主播剃袍,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼黄刚,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了民效?” 一聲冷哼從身側(cè)響起憔维,我...
    開(kāi)封第一講書人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎畏邢,沒(méi)想到半個(gè)月后业扒,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡舒萎,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年程储,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片臂寝。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡章鲤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出咆贬,到底是詐尸還是另有隱情败徊,我是刑警寧澤,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布掏缎,位于F島的核電站皱蹦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏眷蜈。R本人自食惡果不足惜沪哺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望酌儒。 院中可真熱鬧辜妓,春花似錦、人聲如沸今豆。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)呆躲。三九已至异逐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間插掂,已是汗流浹背灰瞻。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工腥例, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人酝润。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓燎竖,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親要销。 傳聞我的和親對(duì)象是個(gè)殘疾皇子构回,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • java script的變量聲明具有hoisting機(jī)制,JavaScript引擎在執(zhí)行的時(shí)候疏咐,會(huì)把所有變量的聲明...
    MC_DEV_JIN閱讀 397評(píng)論 0 0
  • 摘认说А:http://www.jb51.net/article/30719.htm 變量提升 變量提升就是把變量提升...
    潔芬閱讀 145評(píng)論 0 0
  • 繼承 一、混入式繼承 二浑塞、原型繼承 利用原型中的成員可以被和其相關(guān)的對(duì)象共享這一特性借跪,可以實(shí)現(xiàn)繼承,這種實(shí)現(xiàn)繼承的...
    magic_pill閱讀 1,054評(píng)論 0 3
  • 前言 人生苦多酌壕,快來(lái) Kotlin 掏愁,快速學(xué)習(xí)Kotlin! 什么是Kotlin卵牍? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,176評(píng)論 9 118
  • 到卓爾山之前一直不知道這個(gè)地方果港。卓爾山位于青海省祁連縣八寶鎮(zhèn),緊靠八寶河與藏區(qū)神山阿咪東索(牛心山)隔河相望辽慕。9月...
    牧風(fēng)漢子閱讀 300評(píng)論 0 1