精品秘无码一区二区三区老师-精品秘一区二三区免费雷安-精品蜜桃秘一区二区三区-精品蜜桃秘一区二区三区粉嫩-精品蜜桃一区二区三区-精品蜜臀国产aⅴ一区二区三区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

JS 預編譯代碼實例分析

freeflydom
2024年12月2日 10:40 本文熱度 951

了解 JavaScript 引擎在執行代碼過程中所做的一些行為是非常必要的,這有助于我們在遇到莫名其妙的調用時,能夠大致定位問題所在。在我學習了預編譯的相關知識,并基于該文章,引用其中的一段代碼,結合“變量提升”、“函數提升”的小示例,對其進行詳細的分析,算是留作一份筆記鞏固記憶、加深理解。

代碼

console.log(a)
fn1(1)
var a = 123
console.log(a)
var fn1 = () => {
  console.log(a)
}
function fn1(a) {
  console.log(a)
  var a = 666
  console.log(a)
  function a() {}
  console.log(a)
  var b = function () {}
  console.log(b)
  function c() {}
}
fn1(1)

錯誤的推導會讓你認為上述代碼的打印如下:

如果你判斷首行報錯,那么需要了解變量提升
或者你這樣認為
undefined
undefined
666
[Function: a]
[Function: b]
123
undefined
666
[Function: a]
[Function: b]

實際上,上方的代碼打印如下:

undefined
[Function: a]
666
666
[Function: b]
123
123

詳細分析

1. 創建全局對象 GO

在全局執行上下文中,創建全局對象 GO

2. 加載當前 JS 文件

加載并解析當前的 JavaScript 文件。

3. 腳本語法分析

進行語法分析,確保代碼沒有語法錯誤。

4. 當前 JS 文件預編譯

4-1. 查找變量聲明
GO = {
  a: undefined
}
4-2. 查找函數聲明(除了函數表達式)
GO = {
  a: undefined,
  fn1: function fn1(a) {}
}

5. 正常執行(執行到函數調用前)

console.log(a) // 打印 undefined
fn1(1) // 執行到這里了,小心,函數也有預編譯,執行前一刻完成

6. 函數預編譯

6-1. 創建活躍對象 AO
AO = {}
6-2. 查找變量和形參
AO = {
  a: undefined,
  b: undefined
}
6-3. 實參值和形參統一
AO = {
  a: 1,
  b: undefined
}
6-4. 查找函數(非函數表達式)
AO = {
  a: function a() {},
  b: undefined,
  c: function c() {}
}

7. 正常執行函數(根據 AO)

console.log(a)  // 打印 function a() {}
var a = 666  // a 改變,AO.a = 666
console.log(a)  // 打印 666
function a() {}  // 該聲明已提升過,不會覆蓋
console.log(a)  // 打印 666
var b = function () {}  // b 改變,AO.b = function () {}
console.log(b)  // 打印 function () {}
function c() {}  // 該聲明已提升過,不會覆蓋

8. 接著執行函數外代碼,執行到下個函數調用前

fn1(1) // 已講述,上續
var a = 123  // GO 對象中的 a 改變為 123(undefined > 123)
console.log(a)  // 打印 123
var fn1 = () => {  // fn1 改變,GO.fn1 = () => {...}
  console.log(a)
}
function fn1(a) {  // 該聲明已提升過(函數提升),不會覆蓋
  ...
}
fn1(1)  // 執行到這里時,預編譯

9. 函數預編譯

9-1. 創建活躍對象 AO
AO = {}
9-2. 查找變量和形參
AO = {
  a: undefined
}
9-3. 實參值和形參統一
AO = {
  a: 1
}
9-4. 查找函數(非函數表達式)
AO = {
  a: 1
}

10. 正常執行函數(根據 AO)

console.log(a)  // a 不存在當前函數作用域,往上級查找,找到 GO.a,打印 123

總結

  • 全局預編譯:創建 GO 對象,查找變量聲明和函數聲明。
  • 函數預編譯:創建 AO 對象,查找變量和形參,實參值和形參統一,查找函數聲明。
  • 執行階段:按照代碼順序執行,變量賦值和函數調用。



該文章在 2024/12/2 10:40:09 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 伊人久久大香线蕉综合亚洲 | 亚洲欧美一区二区三区日产 | 日韩欧美在线综合网高 | 中文字幕无码不卡电影 | 一区二区三区四区五区/三级黄色软件下载/自拍偷在线精 | 国产成人卡2卡3卡4乱码 | 精品无码不卡一级毛片 | 欧美91精品久久久久网免费 | 亚洲av永久无码精品秋霞电影影院 | 亚洲中文字幕伊人久久无码 | 国产素人自拍 | 亚洲毛片无码专区亚洲乱 | 国产精品野外AV久久久 | 香蕉人人网在线播放 | 精品深夜AV无码一区二区老年 | 亚洲精品欧美二区中文字幕 | 亚洲国产品综合人成综合网站 | 国产在线麻豆日韩蜜桃 | 亚洲av无码大网站在线看 | 国产区精品尤物柚木在线 | 日本一区二区在线播放 | 一本久久a久久精品免费不 一本久久a久久精品不卡 | 欧美黑人添添高潮A片视频 欧美黑人性暴力猛交喷水 欧美黑人性暴力猛交喷水黑人巨大 | 久久久久国产精品熟女影院 | 久久AV无码乱码A片无码苍井空 | 色综合久久精品亚洲国产 | 亚洲午夜精品一级在线 | 性色av极品无码专区亚洲 | 大炕上的肉体乱第2部分 | AV色蜜桃一区二区三区 | 国产女女做受ⅹxx高潮 | 亚洲国产日韩欧美精品一区二区 | 免费看的一级毛片 | 人妻aⅴ无码一区二区三区 人妻97在线视频观看 | 亚洲中文无码精品在线 | 亚洲成av人综合在线观看 | 内射白浆一区二区在线观 | 色偷偷在线视频直播 | 亚洲另类无码一区二区三区 | 3d动漫精品成人一区二区三 | 国产酒店大学生情侣宾馆 |