一起來了解一下JavaScript的預編譯(小結(jié))
JS運行三部曲
js運行代碼共分三步
- 語法分析
- 預編譯
- 解釋執(zhí)行
JavaScript代碼在運行時,首先會進行語法分析,通篇檢查代碼是否存在低級錯誤,然后進行預編譯,整理內(nèi)部的一個邏輯,最后再開始一行一行的執(zhí)行代碼
語法分析
代碼在執(zhí)行之前,系統(tǒng)會通篇掃描一遍,檢查代碼有沒有低級的語法錯誤,比如少寫個大括號。
預編譯
預編譯前奏
預編譯發(fā)生在函數(shù)執(zhí)行的前一刻。變量未經(jīng)聲明就賦值,此變量為全局對象所有
a = 3
var b = c = 4
一切聲明的全局變量,全是window的屬性
var a = 1 ===> window.a = 1
預編譯四部曲
- 創(chuàng)建AO(Activation Object)對象(里面存儲的是函數(shù)內(nèi)部的局部變量)
- 找形參和變量聲明,將變量和形參名做為AO屬性名,值為undefined
- 將實參和形參統(tǒng)一
- 在函數(shù)體里面找函數(shù)聲明,值賦予函數(shù)體
用一個例子來說明一下,也可以自己先給出一個答案,再繼續(xù)往下看
function fn(a) {
console.log(a);
var a = 123;
console.log(a);
function a() {}
console.log(a);
var b = function() {};
console.log(b);
function d() {}
console.log(d)
}
fn(1);
第一步,創(chuàng)建AO(Activation Object)對象 {}第二步,找形參和變量聲明,將變量和形參名做為AO屬性名,值為undefined
{
a: undefined,
b: undefined,
}
第三步,將實參和形參統(tǒng)一
{
a: 1,
b: undefined,
}
第四步,找函數(shù)聲明,值賦予函數(shù)體
{
a: function a() {},
b: undefined,
d: function d() {}
}
所以在函數(shù)fn執(zhí)行的前一刻,a、b、d的值如上所示
所以fn(1)執(zhí)行的結(jié)果為
// ƒ a() {}
// 123
// 123
// ƒ () {}
// ƒ d() {}
在全局作用域里,預編譯過程有些許不同
- 創(chuàng)建GO(Global Object)對象(里面存儲的是函數(shù)內(nèi)部的全局變量)GO === window
- 找形參和變量聲明,將變量和形參名做為GO屬性名,值為undefined
- 在函數(shù)體里面找函數(shù)聲明,值賦予函數(shù)體
解釋執(zhí)行
一行一行的執(zhí)行代碼
實踐題
這里有幾個例題,有興趣的可以看一下
function test(a, b) {
console.log(a);
console.log(b);
var b = 234;
console.log(b);
a = 123;
console.log(a);
function a() {}
var a;
b = 234;
var b = function() {};
console.log(a);
console.log(b);
}
test(1);
global = 100;
function fn() {
console.log(global);
global = 200;
console.log(global);
var global = 300;
}
fn();
var global;
function test() {
console.log(b);
if (a) {
var b = 100;
}
c = 234;
console.log(c);
}
var a;
test();
a = 10;
console.log(c);
總結(jié)
多數(shù)情況下,我們都是采用下面的這種方式來處理預編譯的一個過程
- 函數(shù)聲明,整體提升
- 變量聲明,聲明提升
若是遇見復雜的情況就只能采用最原始的方式來解決問題了
到此這篇關(guān)于一起來了解一下JavaScript的預編譯(小結(jié))的文章就介紹到這了,更多相關(guān)JavaScript 預編譯內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JS中實現(xiàn)replaceAll的方法(實例代碼)
本文是對JS中實現(xiàn)replaceAll的方法進行了詳細的總結(jié)介紹,需要的朋友可以過來參考下,希望對大家有所幫助2013-11-11
分別用marquee和div+js實現(xiàn)首尾相連循環(huán)滾動效果,僅3行代碼
這是本人2007年進行的一項研究,當時網(wǎng)絡上沒有什么既精簡又實用的循環(huán)滾動代碼,所以就自己琢磨了段時間,最終找到這個辦法2011-09-09
使用Javascript實現(xiàn)復制粘貼功能的示例代碼
本篇文章記錄如何通過js代碼實現(xiàn)復制內(nèi)容到剪切板,之后可以粘貼到需要的地方的功能,文中通過代碼示例介紹的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下2023-09-09
JavaScript遞歸操作樹形結(jié)構(gòu)代碼示例
前端樹形結(jié)構(gòu)一般用于網(wǎng)頁的地理位置輸入框,地理位置級聯(lián)選擇,人員的部門選擇等,這篇文章主要給大家介紹了關(guān)于JavaScript遞歸操作樹形結(jié)構(gòu)的相關(guān)資料,需要的朋友可以參考下2024-01-01

