深入理解JS變量提升和函數(shù)提升

1.作用域簡(jiǎn)介

  • 作用域最大的用處:隔離變量,不同作用域下同名變量之間不會(huì)有沖突
  • 作用域中變量值在執(zhí)行過程中產(chǎn)生,而作用域卻是在函數(shù)創(chuàng)建時(shí)確定了
作用域

2.變量提升

ES6還沒有出來的之前,JavaScript只有全局作用域函數(shù)作用域,并沒有塊級(jí)作用域(一個(gè){ }即為一個(gè)塊級(jí)作用域)的概念。無論var聲明的變量處于當(dāng)前作用域的第幾行,都會(huì)被提升到作用域的頭部,并被初始化為undefined——變量提升

        console.log(global);    // undefined
        var global = 'global';
        console.log(global)     // global

        function fn() {
            console.log(a);     // undefined
            var a = 10;
            console.log(a);     // 10
        }
        fn();

之所以會(huì)有上面的結(jié)果是因?yàn)镴S的變量提升導(dǎo)致的,上面的代碼其實(shí)是這樣執(zhí)行的:

        var global;                // 變量提升,全局作用域范圍內(nèi),此時(shí)只是聲明并沒有賦值
        console.log(global);      // undefined
        global = 'global';       // 此時(shí)才賦值
        console.log(global)     // global

        function fn() {
            var a;                 // 變量提升,函數(shù)作用域范圍內(nèi),此時(shí)只是聲明并沒有賦值  
            console.log(a);       // undefined
            a = 10;              // 此時(shí)才賦值
            console.log(a);     // 10
        }
        fn();

3.函數(shù)提升

在JS中創(chuàng)建函數(shù)有兩種方式函數(shù)聲明函數(shù)字面量,只有函數(shù)聲明存在函數(shù)提升。

        console.log(fn1);   // function fn1 () {console.log('我是fn1');}
        console.log(fn2);   // undefined
        function fn1 () {console.log('我是fn1');}
        var fn2 = function() {
            console.log('我是fn2');
        }

因?yàn)楹瘮?shù)聲明的函數(shù)提升,導(dǎo)致上面的結(jié)果,上面的代碼其實(shí)是這么執(zhí)行的:

        function fn1() {
            console.log('我是fn1');
        }
        var fn2;
        console.log(fn1);                // function fn1 () {console.log('我是fn1')}
        console.log(fn2);               // undefined
        fn2 = function () {
            console.log('我是fn2');
        }
        console.log('***', fn2);         //  fn2 = function() {console.log('我是fn2');}

4.強(qiáng)化訓(xùn)練

        (function () {
            console.log(a);     // undefined
            a = 'aaa';
            var a = 'bbb';
            console.log(a);     // 'bbb'
        }
        )()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容