JavaScript 變量提升

記錄一下關(guān)于“ 變量提升 ”的理解:

文章參考:

**一 盅弛、 **
我們先看一段很簡單的代碼:

var v='Hello World';
alert(v);
//彈出“Hello World”

再看一段Code:

var v='Hello World';
(function(){
 alert(v);
})()
//彈出了“Hello World”

但是一段下面的代碼:

var v='Hello World';
(function(){
 alert(v);
 var v='I love you';
})()
結(jié)果卻是:


結(jié)果是 *** undefined ***拉庶?

其實,原因就是JavaScript中的 變量提升(Hoisting)便锨;

二、
在解釋提升之前姚建,首先要知道JavaScript中的作用域(scoping)。JavaScript是函數(shù)級作用域(function-level scope)桥胞。這和其他語言(比如:C語言)的塊級作用域是完全不同的考婴。塊(比如:if語句),在JavaScript中并不會創(chuàng)建一個新的作用域沥阱,只有函數(shù)才會創(chuàng)建新的作用域。 如果你必須在函數(shù)中創(chuàng)建一個臨時的作用域策精,請像下面這樣做:

function foo() {
  var x = 1;
  if (x) {
   (function () {
    var x = 2;
    }());
  }
  // 此處x仍然等于1
}

下面我們說變量提升

其實就是把變量提升提到函數(shù)的top的地方崇棠。而且需要說明的是,變量提升 只是提升** 變量的聲明 **枕稀,并不會把賦值也提升上來。

比如: 我們定義三個變量:

(function(){
 var a='One';
 var b='Two';
 var c='Three';
})()

實際上它是這樣子的:

(function(){
 var a,b,c;
 a='One';
 b='Two';
 c='Three';
})()

這個時候就把變量提升了凹联。

那么哆档,為什么上面的代碼會報錯(undefined)呢?
我們根據(jù)上面變量提升以及JavaScript的作用域(函數(shù)級作用域)的分析瓜浸,得出上面代碼真正變成如下:

var v='Hello World';
(function(){
 var v;

alert(v);
 v='I love you';
})()

所以,才會提示說“undefined”偶惠。
換句話說就是朗涩,原來的代碼中雖然沒有 var v; 這行代碼绑改,當(dāng)執(zhí)行到 alert(v);時兄一,會在當(dāng)前函數(shù)的作用域中尋找變量** V 的定義识腿,而變量 V **的定義語句在alert(v);之后,所以才會報錯骂束。

** 三、**
同時我們也要注意: 函數(shù)提升 同樣只是是把整個函數(shù)都提到前面去展箱。 在我們寫js code 的時候蹬昌,我們有2中寫法,一種是函數(shù)表達(dá)式皂贩,另外一種是函數(shù)聲明方式。我們需要重點注意的是婴栽,只有函數(shù)聲明形式才能被提升。 函數(shù)聲明方式提升【成功】 復(fù)制代碼代碼如下:

function myTest(){
 foo();
 function foo(){
  alert("我來自 foo");
 }
}
myTest();


Paste_Image.png

函數(shù)表達(dá)式方式提升【失敗】 如下:

function myTest(){
 foo();
 var foo =function foo(){
  alert("我來自 foo");
 }
}
myTest();

結(jié)果如下:

此時就報錯了。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末本冲,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子狸膏,更是在濱河造成了極大的恐慌,老刑警劉巖湾戳,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件砾脑,死亡現(xiàn)場離奇詭異,居然都是意外死亡韧衣,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進(jìn)店門氏淑,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人假残,你說我怎么就攤上這事炉擅。” “怎么了谍失?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長仿便。 經(jīng)常有香客問我,道長攒巍,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任闻坚,我火速辦了婚禮兢孝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘跨蟹。我一直安慰自己,他們只是感情好窗轩,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著仓洼,像睡著了一般堤舒。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上舌缤,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天某残,我揣著相機(jī)與錄音漂羊,去河邊找鬼卸留。 笑死,一個胖子當(dāng)著我的面吹牛耻瑟,可吹牛的內(nèi)容都是我干的旨指。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼谆构,長吁一口氣:“原來是場噩夢啊……” “哼框都!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起魏保,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎粱哼,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體揭措,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡刻蚯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了躬充。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片兵扬。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖器钟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情傲霸,我是刑警寧澤眉反,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布寸五,位于F島的核電站,受9級特大地震影響梳杏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜十性,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一塑悼、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧厢蒜,春花似錦、人聲如沸斑鸦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽颂鸿。三九已至攒庵,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間浓冒,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工闲擦, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人场梆。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像寞忿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子腔彰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

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