日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

函数的作用域以及预编译

發(fā)布時(shí)間:2025/3/12 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 函数的作用域以及预编译 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、函數(shù)的作用域

  • 函數(shù)作用域有點(diǎn)像單面鏡(外面看不到里面,里面可以看到外面)
  • JS的特點(diǎn):單線程、是 解釋性語言 (翻譯一行,執(zhí)行一行)

二、預(yù)解析

JS預(yù)解析三部曲:語法解析 ? 預(yù)編譯 ? 解釋執(zhí)行

JS 在執(zhí)行之前會(huì)通篇掃描代碼,看有沒有語法語義錯(cuò)誤(語法解析),如果沒有,然后開始執(zhí)行代碼(預(yù)編譯)

  • 通篇掃描 --> 語法分析
  • 通篇掃描之后開始執(zhí)行 --> 預(yù)解析
test(); // 這種情況仍然會(huì)執(zhí)行,就是預(yù)編譯的作用function test() {console.log('a'); }// 在沒有定義之前就使用結(jié)果為 undefined console.log(a); // 能輸出,是 undefined,還是因?yàn)轭A(yù)解析 var a = 10;// 但是這種就不行,因?yàn)樽兞繘]有定義就執(zhí)行 b is not defined console.log(b);

三、變量和函數(shù)的提升

  • 函數(shù)聲明整體提升:不管你在哪調(diào)用函數(shù),因?yàn)轭A(yù)解析會(huì)把函數(shù)提到邏輯的最前面,所以都是在函數(shù)的下面調(diào)用這個(gè)函數(shù)
  • 變量聲明提升
  • imply global 暗示全局變量:即任何變量,如果變量未經(jīng)聲明就賦值,此變量就為全局對(duì)象所有
  • a = 123; console.log(a); // 123 console.log(window.a); // 123
  • 一切聲明的全局變量,都是 window 屬性
  • var b = 234; console.log(b); --> console.log(window.b); // 234
  • 如果在全局作用域下訪問變量,就相當(dāng)于訪問 window.變量名
  • var a = b = 123; // 順序:先把 123 賦值給 b;再 let a 聲明變量;最后把 b 賦值給 a。 // 但是這就導(dǎo)致了,b 歸全局作用域所有 console.log(window.a, window.b); // undefiend 123var c = d = 234; console.log(window.c, window.d); // 234 234

    預(yù)編譯四部曲

  • 創(chuàng)建AO對(duì)象
  • 找形參和變量聲明,將變量和形參名作為AO屬性名,值為 undefined
  • 將實(shí)參值和形參統(tǒng)一
  • 在函數(shù)體里面找函數(shù)聲明,值賦予函數(shù)體
  • 預(yù)編譯練習(xí)提升的意思就是被優(yōu)先執(zhí)行了

    function fn(a) {console.log(a); // function a() {}var a = 123;console.log(a); // 123function a() {}console.log(a); // 123var b = function () {}console.log(b); // function() {}function d() {} }// 預(yù)編譯發(fā)生在函數(shù)執(zhí)行的前一刻 fn(1);/*1. 創(chuàng)建AO對(duì)象 (Activation Object) 2. 用形參和變量聲明的名,作為AO對(duì)象的屬性名,值統(tǒng)一為 undfiendAO {a : undefined,b : undefined}3. 把形參和實(shí)參的值統(tǒng)一AO {a : 1,b : undefined}4. 在函數(shù)體里面找函數(shù)聲明,賦予函數(shù)體AO {a : function a() {}, // 只有函數(shù)聲明會(huì)提升,函數(shù)表達(dá)式不會(huì)提升b : undefined,d : function d() {}}5. 函數(shù)執(zhí)行AO {a : 123,b : function() {},d : function d() {}} */

    在全局下會(huì)生成一個(gè)GO對(duì)象(Global Object)

    function test() {var a = b = 123;console.log(a);console.log(window.b); // 123console.log(window.a); // undefined } test();/*GO: {b: 123;}AO: {a: undefined} */

    函數(shù)聲明整體提升 變量聲明提升

    a = 100; function demo(e) {function e() {}arguments[0] = 2;console.log(e); // 2if (a) { // a 是 undefined 所以這里 if 不會(huì)執(zhí)行var b = 123;function c() {// 豬都能做出來}}var c;a = 10;var a;console.log(b); // undefinedf = 123;console.log(c); // undefinedconsole.log(a); // 10 } var a; demo(1); console.log(a); // 100 console.log(f); // 123/*GO {a: 100f: 123function demo() {}}AO {c: undefineda: 10e: 2} */

    總結(jié)

    以上是生活随笔為你收集整理的函数的作用域以及预编译的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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