變量聲明 var、let灶搜、const

1. var變量聲明提升

  • var聲明的變量侄柔,發(fā)生變量聲明提升;即:變量的聲明被提升到該作用域的頂部
  • let 和 const 聲明的變量不會發(fā)生變量提升,產(chǎn)生暫時死區(qū)(TDZ)占调,訪問a的時候變量沒有聲明暂题,會報錯; 注:由于出現(xiàn)let聲明,所以出現(xiàn)TDZ
    var a=10;
    function fn(){
        console.log(a)
        var a=90
    }
    fn()

    // 相當(dāng)于以下代碼:

    var a=10;   // 全局變量a
    function fn(){
        var a      // 局部變量a究珊,變量a的聲明提升到此處了
        console.log(a) // 變量a只是聲明了薪者,沒有定義,所以是undefined
        a=90      // 變量a被定義
    }
    fn() // 打印undefined剿涮,變量聲明提升言津,代碼按順序執(zhí)行  

2. 預(yù)處理

在局部作用域中攻人,如果有局部變量,則不會訪問同名的全局變量悬槽,否則怀吻,訪問全局變量
var的變量聲明提升也是由于存在著預(yù)處理

    var a=10;
    function fn(){
        // TDZ 開始
        console.log(a)
        // TDZ結(jié)束,'a'僅在此處初始化初婆,值為20
        let a=20
    }
    fn() // 報錯 Uncaught ReferenceError: Cannot access 'a' before initialization

3. 作用域

let和const聲明的變量會產(chǎn)生塊級作用域
var聲明的變量會穿透if和for語句蓬坡,不會產(chǎn)生塊級作用域

    var array=[]
    for(var i=0;i<3;i++){
        array.push(()=>i)
    }
    console.log(array) // [f,f,f],其中每個f都是()=>i
    var newArray=array.map(el=>el()) //使用map循環(huán)執(zhí)行array中的每個元素(即f函數(shù))此時循環(huán)已經(jīng)結(jié)束,i為3
    console.log(newArray) // [3,3,3]

解釋:誤解作用域磅叛,認(rèn)為for循環(huán)產(chǎn)生了塊級作用域; 在for循環(huán)中使用var聲明的變量屑咳,是單個聲明的變量綁定 (單個存儲空間),循環(huán)過程中弊琴,這個var聲明的變量i是會隨著循環(huán)變化的兆龙,但是,在循環(huán)中執(zhí)行的數(shù)組push方法敲董,最后實際上都push了i最終循環(huán)結(jié)束的3這個值紫皇,最后結(jié)果為[3,3,3]

解決以上問題就是需要創(chuàng)建真正的塊級作用域
方案1 :使用let聲明循環(huán)變量,這個為每個循環(huán)迭代創(chuàng)建一個新的綁定

    var array=[]
    for(let i=0;i<3;i++>){
        array.push(()=>i)
    }
    var newArray=array.map(el=>el())
    console.log(newArray)  // [0,1,2]

方案2:使用閉包腋寨,形成塊級作用域

    var array=[]
    for(var i=0;i<3;i++){
        array[i]=(function(x){
            return function(){
                return x
            }
        })(i)
    }
    var newArray=array.map(el=>el())
    console.log(newArray) // [0,1,2]

4.作用域鏈

如果當(dāng)前作用域找不到變量聲明坝橡,則沿著作用域鏈向上查找,直到找到該變量精置,否則undefined

    var a=10;
    function fn(){
        console.log(a)
    }
    fn()  //最后打印的結(jié)果是:10
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末计寇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子脂倦,更是在濱河造成了極大的恐慌番宁,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赖阻,死亡現(xiàn)場離奇詭異蝶押,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)火欧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進(jìn)店門棋电,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人苇侵,你說我怎么就攤上這事赶盔。” “怎么了榆浓?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵于未,是天一觀的道長。 經(jīng)常有香客問我,道長烘浦,這世上最難降的妖魔是什么抖坪? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮闷叉,結(jié)果婚禮上擦俐,老公的妹妹穿的比我還像新娘。我一直安慰自己握侧,他們只是感情好蚯瞧,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著藕咏,像睡著了一般状知。 火紅的嫁衣襯著肌膚如雪秽五。 梳的紋絲不亂的頭發(fā)上孽查,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機(jī)與錄音坦喘,去河邊找鬼盲再。 笑死,一個胖子當(dāng)著我的面吹牛瓣铣,可吹牛的內(nèi)容都是我干的答朋。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼棠笑,長吁一口氣:“原來是場噩夢啊……” “哼梦碗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起蓖救,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤洪规,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后循捺,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體斩例,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年从橘,在試婚紗的時候發(fā)現(xiàn)自己被綠了念赶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡恰力,死狀恐怖叉谜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情踩萎,我是刑警寧澤正罢,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響翻具,放射性物質(zhì)發(fā)生泄漏履怯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一裆泳、第九天 我趴在偏房一處隱蔽的房頂上張望叹洲。 院中可真熱鬧,春花似錦工禾、人聲如沸运提。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽民泵。三九已至,卻和暖如春槽畔,著一層夾襖步出監(jiān)牢的瞬間栈妆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工厢钧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留鳞尔,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓早直,卻偏偏與公主長得像寥假,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子霞扬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評論 2 359