一起來了解一下JavaScript的預(yù)編譯(小結(jié))
JS運(yùn)行三部曲
js運(yùn)行代碼共分三步
- 語法分析
- 預(yù)編譯
- 解釋執(zhí)行
JavaScript代碼在運(yùn)行時(shí),首先會(huì)進(jìn)行語法分析,通篇檢查代碼是否存在低級(jí)錯(cuò)誤,然后進(jìn)行預(yù)編譯,整理內(nèi)部的一個(gè)邏輯,最后再開始一行一行的執(zhí)行代碼
語法分析
代碼在執(zhí)行之前,系統(tǒng)會(huì)通篇掃描一遍,檢查代碼有沒有低級(jí)的語法錯(cuò)誤,比如少寫個(gè)大括號(hào)。
預(yù)編譯
預(yù)編譯前奏
預(yù)編譯發(fā)生在函數(shù)執(zhí)行的前一刻。變量未經(jīng)聲明就賦值,此變量為全局對(duì)象所有
a = 3
var b = c = 4
一切聲明的全局變量,全是window的屬性
var a = 1 ===> window.a = 1
預(yù)編譯四部曲
- 創(chuàng)建AO(Activation Object)對(duì)象(里面存儲(chǔ)的是函數(shù)內(nèi)部的局部變量)
- 找形參和變量聲明,將變量和形參名做為AO屬性名,值為undefined
- 將實(shí)參和形參統(tǒng)一
- 在函數(shù)體里面找函數(shù)聲明,值賦予函數(shù)體
用一個(gè)例子來說明一下,也可以自己先給出一個(gè)答案,再繼續(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)對(duì)象 {}第二步,找形參和變量聲明,將變量和形參名做為AO屬性名,值為undefined
{ a: undefined, b: undefined, }
第三步,將實(shí)參和形參統(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() {}
在全局作用域里,預(yù)編譯過程有些許不同
- 創(chuàng)建GO(Global Object)對(duì)象(里面存儲(chǔ)的是函數(shù)內(nèi)部的全局變量)GO === window
- 找形參和變量聲明,將變量和形參名做為GO屬性名,值為undefined
- 在函數(shù)體里面找函數(shù)聲明,值賦予函數(shù)體
解釋執(zhí)行
一行一行的執(zhí)行代碼
實(shí)踐題
這里有幾個(gè)例題,有興趣的可以看一下
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ù)情況下,我們都是采用下面的這種方式來處理預(yù)編譯的一個(gè)過程
- 函數(shù)聲明,整體提升
- 變量聲明,聲明提升
若是遇見復(fù)雜的情況就只能采用最原始的方式來解決問題了
到此這篇關(guān)于一起來了解一下JavaScript的預(yù)編譯(小結(jié))的文章就介紹到這了,更多相關(guān)JavaScript 預(yù)編譯內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript ECMA-262-3 深入解析.第三章.this
在這篇文章里,我們將討論跟執(zhí)行上下文直接相關(guān)的更多細(xì)節(jié)。討論的主題就是this關(guān)鍵字2011-09-09JS實(shí)現(xiàn)跟隨鼠標(biāo)閃爍轉(zhuǎn)動(dòng)色塊的方法
這篇文章主要介紹了JS實(shí)現(xiàn)跟隨鼠標(biāo)閃爍轉(zhuǎn)動(dòng)色塊的方法,涉及javascript操作html元素及css樣式的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-02-02layui時(shí)間控件選擇時(shí)間范圍的實(shí)現(xiàn)方法
今天小編就為大家分享一篇layui時(shí)間控件選擇時(shí)間范圍的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-09-09JavaScript函數(shù)中關(guān)于valueOf和toString的理解
本文給大家介紹JavaScript函數(shù)中關(guān)于valueOf和toString的理解,簡(jiǎn)單的說就是需要轉(zhuǎn)換為字符串時(shí),會(huì)調(diào)用toString,需要轉(zhuǎn)換為數(shù)字時(shí)需要調(diào)用valueOf。對(duì)js valueof tostring知識(shí)感興趣的朋友一起學(xué)習(xí)吧2016-06-06微信小程序開發(fā)(三):返回上一級(jí)頁面并刷新操作示例【頁面?!?/a>
這篇文章主要介紹了微信小程序開發(fā)返回上一級(jí)頁面并刷新操作,結(jié)合實(shí)例形式詳細(xì)分析了微信小程序返回上一級(jí)頁面并刷新操作方法技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下2020-06-06