javascript 作用域戚哎,變量提升裸诽,函數(shù)提升

ES6 之前,js 只有兩種作用域:

  • 全局作用域
  • 函數(shù)作用域

是沒有 塊級作用域的

全局作用域變量:

  • 不是在函數(shù)內(nèi)部定義的
  • 未使用 var 聲明的

函數(shù)作用域變量:
只要在函數(shù)中定義的變量型凳,函數(shù)內(nèi)部都可以訪問到丈冬。即使是后定義的,表現(xiàn)為提升到函數(shù)頂部甘畅,所以函數(shù)任何位置都可以訪問該變量

什么是 變量提升(hoisting):
因?yàn)樽兞可昝魇窃谌我獯a執(zhí)行前處理的(注意埂蕊,只是聲明),在代碼區(qū)中任意地方申明變量和在最開始(最上面)的地方申明是一樣的疏唾。也就是說蓄氧,看起來一個(gè)變量可以在申明之前被使用!這種行為就是所謂的“hoisting”槐脏,也就是變量提升喉童,看起來就像變量的申明被自動移動到了函數(shù)或全局代碼的最頂上。

示例:



輸出: undefined

解析:運(yùn)行之前顿天,先處理所有變量聲明堂氯,全局變量會提升到文件開頭,函數(shù)內(nèi)聲明變量會提升到函數(shù)開頭牌废。所以 var tmp = 'hello' 會將 var tmp 提升至函數(shù)開頭咽白,但是此刻并不會賦值。所以 console 輸出的是 undefined

理解了上面鸟缕,那么下面這個(gè)就好理解了:



所以晶框,建議變量聲明 全局或者函數(shù)最頂上,可讀性好。

繼續(xù):



輸出: 1 2 2.
變量被聲明后三妈,不會再次聲明畜埋,相當(dāng)于:


函數(shù)和變量同時(shí)聲明:


輸出: function foo(){}

如果改成下面形式:



輸出: undefined


輸出: ReferenceError, 因?yàn)檎{(diào)用的時(shí)候莫绣, foo 為 undefined

如果還有一個(gè)同名foo 函數(shù)放到第一個(gè) foo 后面:
function foo () {
console.log('foo2')
}
輸出: ‘foo2'

為什么畴蒲?
函數(shù)提升分為兩種情況:

  • 函數(shù)聲明: function foo(){}
  • 函數(shù)表達(dá)式: var foo = function(){}

第二種就是聲明一個(gè) foo 變量,然后將一個(gè)匿名函數(shù)賦值給 foo, 和上面變量聲明是一樣的对室。所以輸出 undefined

第一種會將函數(shù)聲明整個(gè)提升到開頭模燥,相當(dāng)于:


并且函數(shù)聲明優(yōu)先于變量聲明,所以掩宜,輸出: function foo(){}
同名的函數(shù)聲明會使用最后一個(gè)

  1. 首先蔫骂,解釋器掃描Function Declarations,也就是function name{},解釋器將對每個(gè)聲明創(chuàng)建一個(gè)函數(shù)并作為Window的一個(gè)變量
  2. 解釋器掃描var declarations,作為window的屬性。但是此時(shí)變量并沒有被賦值牺汤,所有的變量此時(shí)都是undefined辽旋。

要徹底理解JS的作用域和Hoisting,只要記住以下三點(diǎn)即可:
1檐迟、所有申明都會被提升到作用域的最頂上
2补胚、同一個(gè)變量申明只進(jìn)行一次,并且因此其他申明都會被忽略
3追迟、函數(shù)聲明的優(yōu)先級優(yōu)于變量申明溶其,且函數(shù)聲明會連帶定義一起被提升

繼續(xù)下面的示例:



輸出: 'foo'
解析: 函數(shù)聲明優(yōu)先于變量聲明,再次聲明都被忽略敦间。

下面輸出什么瓶逃?


輸出結(jié)果:
先彈框:



然后輸出 2
然后又彈框:



最后:

解析:
函數(shù)聲明比表達(dá)式賦值優(yōu)先級高,所以第一個(gè)alert 彈出 聲明的函數(shù)
a() 輸出 2
接下來解析到變量 a 被賦值 var a = function(){}廓块,雖然這個(gè)時(shí)候 a 已經(jīng)被函數(shù)聲明賦值厢绝,但是可以被后續(xù)的賦值覆蓋掉,所以之后 a 的值是第一個(gè)函數(shù)
所以带猴,接下來彈出 1
因?yàn)榇嬖诤瘮?shù)作用域昔汉,所以內(nèi)部定義的變量,外部是訪問不到的浓利,所以報(bào)錯 d 未定義
alert(c) 由于報(bào)錯執(zhí)行不到

解析:
a = null 將 function a() 置成 null 了挤庇,不再是函數(shù)了

let, const 都存在變量提升,但是有點(diǎn)不一樣贷掖。后續(xù)會講到嫡秕。

關(guān)注我,每天更新技術(shù)干貨苹威!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末昆咽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掷酗,老刑警劉巖调违,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異泻轰,居然都是意外死亡技肩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門浮声,熙熙樓的掌柜王于貴愁眉苦臉地迎上來虚婿,“玉大人,你說我怎么就攤上這事泳挥∪蝗” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵屉符,是天一觀的道長剧浸。 經(jīng)常有香客問我,道長矗钟,這世上最難降的妖魔是什么唆香? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮真仲,結(jié)果婚禮上袋马,老公的妹妹穿的比我還像新娘。我一直安慰自己秸应,他們只是感情好虑凛,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著软啼,像睡著了一般桑谍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上祸挪,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天锣披,我揣著相機(jī)與錄音,去河邊找鬼贿条。 笑死雹仿,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的整以。 我是一名探鬼主播胧辽,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼公黑!你這毒婦竟也來了邑商?” 一聲冷哼從身側(cè)響起摄咆,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎人断,沒想到半個(gè)月后吭从,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡恶迈,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年涩金,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝉绷。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鸭廷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出熔吗,到底是詐尸還是另有隱情,我是刑警寧澤佳晶,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布桅狠,位于F島的核電站芜赌,受9級特大地震影響冤寿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜发钝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一菇篡、第九天 我趴在偏房一處隱蔽的房頂上張望漩符。 院中可真熱鬧,春花似錦驱还、人聲如沸嗜暴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闷沥。三九已至,卻和暖如春咐容,著一層夾襖步出監(jiān)牢的瞬間舆逃,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工戳粒, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留路狮,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓蔚约,卻偏偏與公主長得像奄妨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子炊琉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

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