• <abbr id="chdyf"></abbr>
    <ruby id="chdyf"><acronym id="chdyf"><meter id="chdyf"></meter></acronym></ruby>
    <bdo id="chdyf"></bdo>
    <dfn id="chdyf"><menu id="chdyf"></menu></dfn>
    1. <menuitem id="chdyf"></menuitem><strong id="chdyf"><menu id="chdyf"></menu></strong>

      <rt id="chdyf"><menu id="chdyf"></menu></rt>
      成人小说一区二区三区,伊人精品成人久久综合全集观看,久久HEZYO色综合,中文字幕精品人妻熟女,影音先锋成人网站,我要看免费一级毛片,中国女人做爰A片,中文字幕av久久爽Av

      詳解函數(shù)和變量的聲明提升

      2019-11-22    seo達(dá)人

      詳細(xì)解讀—函數(shù)和變量的聲明提升

      一 - 聲明提升常見面試題

      ?我們先以幾道面試題開頭來引入,

      ?大家可以先給自己做出一個答案,然后再看文章的思路捋一捋喲。



      來一道基礎(chǔ)的吧~



      var a="Hello";  

      function test(){  

        alert(a); 

        var a="World";

        alert(a);

      }

      test();



      難度+1



      var a = 1;

      function outer(){ 

        a = 2; 

        function inner(){       

            alert(a); 

            a = 4; 

        } 

        inner();



      outer(); 

      alert(a);



      繼續(xù)加油



      (function(){

        f1(); 

        f2();

        var f1 = function(){};

        function f2(){

            alert(1);

        }

      })();



      最后一道



      (function () {

         console.log(a);

         var a=1;

         function a() {

             console.log("biu~");

         }

      })()



      二 - 究竟什么是聲明提升?

      引擎在解釋JS代碼之前,首先要對JS代碼進(jìn)行編譯,其中編譯的一部分工作就是找到所有的聲明,包括變量和函數(shù)的所有聲明都會在任何代碼被執(zhí)行前首先被處理。

      var a = 1這句話會被瀏覽器讀成 var a和a = 1兩句話執(zhí)行,其中var a會在編譯階段就先執(zhí)行了,而a = 1這段賦值代碼會在原地等待執(zhí)行階段。

      console.log(a); 

      var a = 2;



      上邊這段代碼,如果代碼按照順序由上自下執(zhí)行,那么執(zhí)行到console.log(a);時,a還沒有聲明,所以會包一個找不到變量a的錯,但是事實(shí)上,這句話打印了一個undefined,說明a被聲明了,但是沒有被賦值,那么結(jié)合上一段的文字,我們可以得出代碼實(shí)際運(yùn)行的是這樣的:



      var a;

      console.log(a);

      a = 2;



      三 - 函數(shù)的提升

      大家可能在書寫代碼的時候發(fā)現(xiàn),無論函數(shù)封裝寫在前或者后,我們的函數(shù)調(diào)用都可以順利執(zhí)行。



      fn1();//可以執(zhí)行

      function fn1() {

          console.log("hello");

      }



      為什么呢?其實(shí)函數(shù)聲明,包括函數(shù)的代碼塊都i會被提升,所以調(diào)用函數(shù)的時候,函數(shù)聲明已經(jīng)被執(zhí)行過了。



      但是有個案例大家了解一下:



      fn2();//報(bào)錯,fn2不是一個函數(shù)

      var fn2 = function () {

         console.log("world");

      }



      我們可以看到 以給匿名函數(shù)賦值的形式定義函數(shù),只會提升函數(shù)聲明,但是函數(shù)表達(dá)式卻不會被提升。因?yàn)樽兞縡n2被提升,但是并沒有賦值,我們書寫的fn2()無法運(yùn)行,而拋出了異常。

      以下就是實(shí)際執(zhí)行的順序:



      var fn2;

      fn2();

      fn2 = function () {

         console.log("world")

      }



      函數(shù)優(yōu)先提升

      我們都知道了,函數(shù)聲明和變量聲明都會被提升,那么遇到這樣的情況會怎么辦?



      fn3();

      var fn3=function () {

          console.log("fn3-1");

      }

      fn3();

      function fn3() {

          console.log("fn3-2");

      }



      哎呦,嘛情況,突然迷了!!!

      ? 這個時候你就要考慮,同樣的一個變量名稱,到底是把var fn3給先提聲上去,再提升 fn3函數(shù)體?還是先提升 fn3函數(shù)體,再提升var fn3???其實(shí)都不對!!!



      ? 答案是:函數(shù)會被優(yōu)先提升,但后才是變量提升,但是當(dāng)函數(shù)提升后,然后發(fā)現(xiàn)還有一個變量聲明和函數(shù)聲明一樣的名稱,這個就是重復(fù)聲明,那么這個var fn3 是不生效直接忽略的。



      所以實(shí)際代碼運(yùn)行順序是:



      function fn3() {

         console.log("fn3-2");

      }

      fn3();//fn3-2

      fn3=function () {//var fn3因?yàn)橹貜?fù)聲明被忽略

         console.log("fn3-1");

      }

      fn3();//fn3-1



      當(dāng)然,我們還是建議再同一個作用域重復(fù)聲明是很爛的選擇



      說在最后

      再代碼作用域中的聲明,都會在代碼執(zhí)行前被首先處理,所有的聲明都會被移動到各自作用域的最頂端,這個過程就叫做聲明提升。



      四 - 答案:

      問題1:



      var a="Hello";  

      function test(){  

        alert(a); 

        var a="World";

        alert(a);

      }

      test();



      實(shí)際執(zhí)行:

      var a="Hello";

      function test(){

         //作用域有聲明a,聲明提升到這里

         var a;

         alert(a);//本作用域聲明a,所以不去使用父作用域的a,但是本作用域的a沒有賦值,所以彈出undefined

         a="World";

         alert(a);//賦值后 ,彈出world

      }

      test();



      問題2:



      var a = 1;

      function outer(){ 

        a = 2; 

        function inner(){       

            alert(a); 

            a = 4; 

        } 

        inner();



      outer(); 

      alert(a);



      執(zhí)行結(jié)果:



      var a = 1;

      function outer(){

         a = 2;

         function inner(){

             //本作用域沒有聲明a,所以沒有任何提升,直接執(zhí)行

             alert(a); // 所以彈出 a為 2

             a = 4;

         }

         inner();

      }

      outer();

      alert(a);//只有全局聲明了a,所以所有作用域使用的都是全局的a,所以a最后被賦值為4 彈出4



      問題3



      (function(){

        f1(); 

        f2();

        var f1 = function(){};

        function f2(){

            alert(1);

        }

      })();

      實(shí)際執(zhí)行結(jié)果:



      (function(){

         function f2(){

             alert(1);

         }

         var fn1;

         f1();//提升后先執(zhí)行fn1(),但是fn1被提升的是變量不是函數(shù),所以這里報(bào)錯,不是一個函數(shù)

         f2();//上一句話報(bào)錯,這句話不再運(yùn)行

         f1 = function(){};

      })();



      問題4:



      (function () {

         console.log(a);

         var a=1;

         function a() {

             console.log("biu~");

         }

      })()

      實(shí)際執(zhí)行結(jié)果:



      (function () {

         function a() {

             console.log("biu~");

         }

         console.log(a);//打印了a這個函數(shù)的函數(shù)體

         a=1;//因?yàn)楹瘮?shù)有限聲明提升,所以這里的var a被提升時,發(fā)現(xiàn)重復(fù)聲明,故被忽略了var a;    

      })()


      日歷

      鏈接

      個人資料

      存檔

      主站蜘蛛池模板: 精品麻豆一区二区三区乱码| A片黄色| 日本精品中文字幕在线不卡| 亚洲第一成人网站| 91高清国产| 制服丝袜亚洲在线| 超碰精品在线| 日韩一级片| av在线亚洲男人天堂| 日本一区二区在免费观看喷水| chinese国产av| 国产,精品,无码,丝袜| 邵武市| 免费一级毛片在级播放| 亚洲大尺度在线观看| 激情婷婷五月天| 多p在线观看| 夊夊夊夂夂夂夂夂夂夂亚洲亚洲亚洲亚洲色色色 | 亚洲AV日韩AV永久无码网站| 蜜桃秘?av一区二区三区安全| 韩国AV在线| 兴海县| 亚洲综合色区激情自拍| 成人福利午夜A片公司| 一区二区三区XX00| 中文字幕+乱码+中文字幕一区| 欧美三级片在线观看| 欧美 亚洲 国产 视频 小说| 大帝AV| 黄色日本视频| 欧美全免费aaaaaa特黄在线| 久久伊人天堂视频网| 传媒视频??高清一区传媒| 色悠悠撸视频| 久久99精品视频| 国产91无毒不卡在线观看| 九九久久国产精品免费热6| 91人妻无码| 日本色导航| 四虎永久在线精品免费AV| 加勒比综合网|