變量提升

這里說(shuō)的變量提升指的是使用var聲明的變量

變量提升也可以說(shuō)是“變量聲明前置”场航,就是把函數(shù)里面用到的變量聲明提升到前面切省,賦值步驟在書寫的位置進(jìn)行您旁。

是否使用var定義變量的區(qū)別

function foo () {
  var a = 'var-a'
  b = 'var-b'
}

foo()
console.log(b) // 'var-b'
console.log(a) // ReferenceError: a is not defined
  • 使用var定義的變量是函數(shù)級(jí)變量,只在函數(shù)內(nèi)能訪問(wèn)到汉额。
  • 不使用var定義的變量是全局變量曹仗,等同于window.b = 'var-b'
  • 變量提升先于代碼執(zhí)行

塊級(jí)作用域和函數(shù)級(jí)作用域

  • 使用傳統(tǒng)的var定義的變量執(zhí)行的是函數(shù)級(jí)作用域

描述一下就是:在函數(shù)中使用var定義的變量都會(huì)將變量聲明放在函數(shù)的第一行蠕搜,變量賦值在書寫的位置賦值怎茫。

  • 使用let定義變量將執(zhí)行塊級(jí)作用域,即{}內(nèi)范圍
function test () {
  var varvars = 'varvars'
  let letvars = 'letvars'
 
  if(true){
     var varvars = '11'
     let letvars = '22'
  }
  
  console.log('test varvars:' + varvars)
  console.log('test letvars:' + letvars)
}

test()

等同于:

function test () {
  var varvars = undefined
  let letvars = 'letvars'
  
  varvars = 'varvars'
 
  if(true){
     varvars = '11'
     let letvars = '22'
  }
  
  console.log('test varvars:' + varvars) // 1
  console.log('test letvars:' + letvars) // letvars
}

test()

結(jié)合函數(shù)執(zhí)行過(guò)程說(shuō)明

當(dāng)程序進(jìn)入執(zhí)行的上下文(代碼真正執(zhí)行之前)妓灌,變量對(duì)象(VO)已經(jīng)包含的屬性是:

  • 函數(shù)的所有形參

創(chuàng)建由變量名稱對(duì)應(yīng)值組成的一個(gè)變量對(duì)象轨蛤,如果名稱沒(méi)有對(duì)應(yīng)的值時(shí),默認(rèn)值為undefined

  • 所有函數(shù)聲明

創(chuàng)建由函數(shù)名函數(shù)對(duì)象組成的一個(gè)變量對(duì)象虫埂,如果函數(shù)名已存在則完全替換

  • 所有變量聲明(var聲明)

創(chuàng)建由名稱對(duì)應(yīng)值組成的一個(gè)變量對(duì)象祥山,如果名稱沒(méi)有對(duì)應(yīng)的值時(shí),默認(rèn)值為undefined
掉伏,如果函數(shù)名已存在則完全替換

示例及優(yōu)先級(jí)說(shuō)明

function test (name) {
  var name = undefined  // 這里的定義將覆蓋形參name和函數(shù)name, 聲明提升缝呕,默認(rèn)為undefined
  function name () { // 這里定義的name函數(shù)將覆蓋形參name
    console.log('hello')
  }
  
  name = 'inner' // 這里的定義將覆蓋形參name和函數(shù)name
  console.log(name) // 輸出 inner
}


test('outer')

或者:

function test (name) {
  // 1. 形參: {name: 'outer'}
  // 2. 函數(shù): {name: function () { // ... }} 覆蓋上面的同名定義
  // 3. 變量: {name: 'inner'} 覆蓋上面的同名定義,多個(gè)var賦值取最后一次賦值
  
  var name = 'inner'  // 這里的定義將覆蓋形參name和函數(shù)name, 聲明提升斧散,這里的定義將覆蓋形參name和函數(shù)name
  function name () { // 這里定義的name函數(shù)將覆蓋形參name
    console.log('hello')
  }

  console.log(name) // 輸出 inner
}


test('outer')

注意:

  • 不管var聲明放在何處供常,結(jié)果都是一樣的
  • 多次var聲明同一個(gè)變量,代碼不會(huì)報(bào)錯(cuò)鸡捐,聲明前置栈暇,原地賦值
  • 如果使用let聲明,則不可定義已存在的變量名(包括 函數(shù)名和形參)箍镜, 返回錯(cuò)誤
SyntaxError: Identifier 'name' has already been declared

總結(jié)

  • var定義的變量函數(shù)級(jí)作用域
  • var定義的變量會(huì)有變量聲明提升的現(xiàn)象源祈,但是在書寫位置賦值
  • let定義的變量塊級(jí)作用域煎源,不會(huì)出現(xiàn)變量聲明提升的現(xiàn)象,在書寫的位置聲明及賦值香缺,變量名稱不能和 [形參名稱/函數(shù)名稱] 重復(fù)手销。
  • 生效優(yōu)先級(jí):變量名(var定義) > 函數(shù)名 > 形參名
  • let不會(huì)出現(xiàn)同名的問(wèn)題,但是函數(shù)名 > 形參名的情況會(huì)存在
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末图张,一起剝皮案震驚了整個(gè)濱河市原献,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌埂淮,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件写隶,死亡現(xiàn)場(chǎng)離奇詭異倔撞,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)慕趴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門痪蝇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人冕房,你說(shuō)我怎么就攤上這事躏啰。” “怎么了耙册?”我有些...
    開(kāi)封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵给僵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我详拙,道長(zhǎng)帝际,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任饶辙,我火速辦了婚禮蹲诀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弃揽。我一直安慰自己脯爪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布矿微。 她就那樣靜靜地躺著痕慢,像睡著了一般。 火紅的嫁衣襯著肌膚如雪冷冗。 梳的紋絲不亂的頭發(fā)上守屉,一...
    開(kāi)封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天,我揣著相機(jī)與錄音蒿辙,去河邊找鬼拇泛。 笑死滨巴,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的俺叭。 我是一名探鬼主播恭取,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼熄守!你這毒婦竟也來(lái)了蜈垮?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤裕照,失蹤者是張志新(化名)和其女友劉穎攒发,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體晋南,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年偶妖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片扼鞋。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡转锈,死狀恐怖撮慨,靈堂內(nèi)的尸體忽然破棺而出砌溺,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布肌厨,位于F島的核電站,受9級(jí)特大地震影響表鳍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜胁镐,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一笨农、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧份招,春花似錦锁摔、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)衅疙。三九已至炼蛤,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嗽上,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工哲思, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人丧肴。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像胧后,于是被迫代替她去往敵國(guó)和親芋浮。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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