国产高清在线免费观看-国产高清在线免费无码-国产高清在线男人的天堂-国产高清在线视频-国产高清在线视频精品视频-国产高清在线视频伊甸园

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

JS 預(yù)編譯代碼實例分析

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

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

代碼

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)

錯誤的推導(dǎo)會讓你認(rèn)為上述代碼的打印如下:

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

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

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

詳細(xì)分析

1. 創(chuàng)建全局對象 GO

在全局執(zhí)行上下文中,創(chuàng)建全局對象 GO

2. 加載當(dāng)前 JS 文件

加載并解析當(dāng)前的 JavaScript 文件。

3. 腳本語法分析

進(jìn)行語法分析,確保代碼沒有語法錯誤。

4. 當(dāng)前 JS 文件預(yù)編譯

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

5. 正常執(zhí)行(執(zhí)行到函數(shù)調(diào)用前)

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

6. 函數(shù)預(yù)編譯

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

7. 正常執(zhí)行函數(shù)(根據(jù) 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. 接著執(zhí)行函數(shù)外代碼,執(zhí)行到下個函數(shù)調(diào)用前

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

9. 函數(shù)預(yù)編譯

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

10. 正常執(zhí)行函數(shù)(根據(jù) AO)

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

總結(jié)

  • 全局預(yù)編譯:創(chuàng)建 GO 對象,查找變量聲明和函數(shù)聲明。
  • 函數(shù)預(yù)編譯:創(chuàng)建 AO 對象,查找變量和形參,實參值和形參統(tǒng)一,查找函數(shù)聲明。
  • 執(zhí)行階段:按照代碼順序執(zhí)行,變量賦值和函數(shù)調(diào)用。



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

主站蜘蛛池模板: 97久久精品人人槡人妻人小说下载电影久久人人爽天天玩人 | 日韩激情影院 | 亚洲精品久久AV无码一区二 | 国产二区三区午夜免费视频 | 精品国内自产拍在线视频 | 巨爆乳肉感一区二区三区 | 精品久久免费一区二区三区四区 | 日韩精品人妻系列一区二区三区 | 成人a视频高清在线观看 | 另类激情文学一 | 在线视频一区二区欧美日韩 | 一本道久久精 | 亚洲综合日韩中文字幕v在线 | 无码的免费不卡的毛片视频 | 日韩欧美亚洲每日更新在线观看 | 人妻熟女αⅴ一区二区三区 | 人妻少妇精品无码一区二区 | 熟妇人妻无乱码中文字幕真矢织江三区高清hd美女 | 丁香花丁香五香天堂网 | 亚洲国产日韩成人综合天堂 | 内射免费视频观看 | 亚洲无码激情在线观看 | 91久久精品国产 | 亚洲中久无码不卡永久在线观看 | 一区二区成人国产精品 | 亚洲一级毛片手机播放 | 国产在线观看不卡 | 国产精品萌白酱在线观看 | 精品动漫无码在线一区二区三区 | 午夜人妻无码AV一区二区 | 2025国产微拍精品一区二区 | 无线看天堂av | 国产拍拍拍无码视频免费 | 国产高潮刺激叫喊视频 | 国产成人麻豆tv在线观看 | 国产高跟黑色丝袜在线 | 中文字幕久久人妻一区二区三区 | 最新国产在线拍揄自揄视频 | 亚洲a∨无码无在线观看 | 欧美人与动另类xxxx | 亚洲国产精品嫩草影院在线观看 |