日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

JS预编译过程

發(fā)布時(shí)間:2023/12/10 javascript 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JS预编译过程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

首先講預(yù)編譯過程

JS代碼執(zhí)行過程三部曲

過程

  • 語法分析:首先掃描一遍,看有沒有低級(jí)的語法錯(cuò)誤
  • 預(yù)編譯
  • 解釋執(zhí)行:解釋一行執(zhí)行一行
  • 預(yù)編譯low講

  • 函數(shù)聲明整體提升,變量 的聲明提升(這個(gè)其實(shí)很low,點(diǎn)擊low點(diǎn))
  • 假如沒有預(yù)編譯的話

    a(); function a(){console.log("a") } 先調(diào)用再聲明,在沒有預(yù)編譯的情況下,不能正常輸出,但是有了預(yù)編譯就可以正常輸出,這就是函數(shù)整體提升; 定義一個(gè)變量 var a = "1233" 這個(gè)過程叫做變量的聲明 和 賦值 console.log(a); //undefined var a = "1233" 變量 聲明提升,但是賦值未被提升

    low點(diǎn)

    函數(shù)聲明整體提升,變量 的聲明提升 上面說的這兩個(gè)點(diǎn)不能解釋下面的代碼 console.log(a);var a = "aaaa";function a(a){var a = 5;}

    手動(dòng)懵逼why???

    真·預(yù)編譯?前奏
    暗示全局變量 imply global

    1.任何變量未經(jīng)聲明就賦值,這個(gè)變量就為全局對(duì)象(window)所擁有; ---------------------------------------------------------------------------------------------------- 2.全局上聲明的任何變量,即使聲明了也歸window 所有;window就是全局的域. a = 1;var b = 2;

    function ddd(){var a = b = 12;//賦值是從右向左,,雖然是在函數(shù)局部作用域內(nèi),12先賦值給了b,b并沒聲明所以b是屬于window的,a是局部的,然后b在賦值給 a}ddd()


    真·預(yù)編譯四部曲
    AO 對(duì)象中四步

    預(yù) 編 譯 發(fā) 生 在 函 數(shù) 執(zhí) 行 的 前 一 刻 function fn(a){console.log(a);var a = 123;console.log(a);function a(){}console.log(a);var b = function () {};console.log(b);} fn(1) 1. 創(chuàng)建AO對(duì)象,Activation Object (執(zhí)行期上下文) AO{ }
  • 找形參和變量的聲明,將變量的和形參名作為AO屬性名,值為undefined
  • AO{a:undefined,b:undefined, }
  • 將實(shí)參和形參統(tǒng)一
  • AO{a:1,b:undefined, }
  • 在函數(shù)體里面,找 函數(shù)聲明,值賦予 函 數(shù) 體;
  • AO{a:function a(){}// 把形參覆蓋了 注意:**function a(){} 是函數(shù)聲明 只有它能提升; var b = function(){}這種是表達(dá)式**b:undefined, }

    到此AO 對(duì)象創(chuàng)建完了
    然后馬上執(zhí)行函數(shù)了 電腦從 AO 對(duì)象里面 拿東西

    所以第一次打印的是function a(){},

    a 被賦值123,第二次打印的是123,

    然后因?yàn)閒unction a(){}已經(jīng)被提升上去,所以不用看,第三次打印也是123,

    第四次打印的function ({被提升,所以最后一次打印是function(){}}
    輸出

    // } function test(a,b){console.log(a); //function a(){};console.log(b); //undefinedvar b = 234;console.log(b) //234a = 123;console.log(a); //123function a(){};var a ;b = 234;var b = function(){};console.log(a); //123console.log(b); //function(){}; } test(1) 1. AO:{//過程}2. AO:{a:undefined;b:undefined;}3. AO:{a:1;b:undefined;}4. AO:{a:function a(){};b:undefined;} 所以第一次輸出的a是 function a(){};b 是undefined b=234AO:{a:function a(){};b:234;}下個(gè)b輸出就是234a = 123AO:{a:123;b:234;}下個(gè)a輸出就是123

    ===中間的聲明對(duì)AO對(duì)象不產(chǎn)生影響所以輸出不變

    var b = function(){};AO:{a:123;b:function(){};}


    GO 對(duì)象 global object 全局的執(zhí)行上下文 === window
    其實(shí)差不多

    console.log(a) // 輸出的 function a(){}var a = 123; function a(){ } console.log(a) //123 1.GO{} 2.GO{a:undefined} 3.GO{a:function a(){}} 4.GO{a:123}

    GO AO 一起的

    console.log(test); // 這個(gè) 輸出的是 function test(){},完了之后,就該調(diào)用函數(shù)了 function test(test){console.log(test); // function test(){} 這個(gè)是自己的testvar test = 123;console.log(test); //123function test(){} } test(1); var test = 123;

    理解了預(yù)編譯就很簡(jiǎn)單

    【注】局部輸出或者使用一個(gè)變量,或者方法,假如說內(nèi)外部都有,優(yōu)先使用內(nèi)部的(局部的),局部沒有才去全局找 這一點(diǎn)來個(gè)超級(jí)無敵簡(jiǎn)單的例子: var global = 100; function fn(){console.log(global) // 100; } fn() 很簡(jiǎn)單輸出的 100過程 先來個(gè)全局 GO 對(duì)象 從上到下 GO{global:100,fn:function(){...}, }然后執(zhí)行 fn 來個(gè)局部的 AOAO{// 什么都沒有,么有變量和形參聲明,只能去全局GO里面找global 就輸出; 100} global = 100;function fn(){console.log(global); //undefinedglobal = 200;console.log(global); //200var global = 300;console.log(global) //300}fn()var global;

    function test(){console.log(b); //undefinedif(a){ //a == undefined ==>falsevar b = 100; //跳過賦值}console.log(b)undefinedc = 234;console.log(c) //234 } var a ; test(); a = 10; console.log(c) // GO{ // a:undefined; // test:function(){...} // }// AO{ // b:undefined, 預(yù)編譯,可以跳過循環(huán),循環(huán)語句里的變量聲明已經(jīng)寫入了內(nèi)存,所以輸出是undefined // 變量c在函數(shù)內(nèi)部沒有聲明,就被全局接受,【參考以上知識(shí)點(diǎn)】 //}

    總結(jié)

    以上是生活随笔為你收集整理的JS预编译过程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。