JS的解析與執(zhí)行過程

<script>

/*

今天學(xué)習(xí)了JS的解析與執(zhí)行過程娄涩,感覺好牛逼,記錄下來绢要,以便日后復(fù)習(xí)

*/

//一階段

var a = 5;

function f(n){

alert(a);

}

f();

/*

上面代碼的全局處理過程:

1吏恭、預(yù)處理階段

????a、讀取分析整個源代碼

????b重罪、先掃描函數(shù)聲明樱哼,之后掃描變量(var聲明)

????????b_a哀九、處理函數(shù)聲明時有沖突,會覆蓋

????????b_b唇礁、處理變量聲明時有沖突勾栗,會忽略

????c、將掃描到的函數(shù)和變量保存到一個對象中(全局的保存到window對象中)

????d盏筐、變量的值是undefined围俘,函數(shù)的值則指向該函數(shù)(是一個函數(shù)字符串)

? ? ? ? ? ?形式如下:{a : undefined, f : 'function(){alert(a);var a = 5;}'}

2、運行階段

????在我們剛剛的案例中

????a琢融、將變量a的值從undefined改為5

????b界牡、調(diào)用f(),一遍函數(shù)得到執(zhí)行

上面函數(shù)代碼的處理過程:

????1漾抬、預(yù)處理階段

????????a宿亡、將函數(shù)的參數(shù)添加到一個對象(詞法對象)

????????b、掃描函數(shù)聲明纳令,之后掃描變量(var聲明)

????????d挽荠、將掃描到的函數(shù)和方法添加到詞法對象里面

????????c、變量的值是undefined平绩,函數(shù)的值則指向該函數(shù)(與全局的一樣)

????2圈匆、運行階段

????????與全局的的運行原理一樣

*/


//二階段

var b = 1;

function ff(){

alert(b);

var b = 5;

alert(b);

}

ff();

//結(jié)果彈出為:undefined

/*

原因:

js在預(yù)處理階段時,將函數(shù)ff()和變量b保存到window對象中捏雌,

此時b = undefined跃赚,到了運行階段,b = 1性湿,這時調(diào)用函數(shù)ff()纬傲,

js會先把函數(shù)內(nèi)的變量添加到詞法對象中,此時b = undefined肤频,

再之后alert(b)叹括,因為是在方法內(nèi)部,所以alert(b)會調(diào)用詞法

對象中的b宵荒。然而這時詞法對象中的b = undefined领猾,所以執(zhí)行結(jié)

果彈出的是undefined,當(dāng)alert執(zhí)行完之后b = 5;

*/


//三階段

alert(a);

function a() {

console.log("xx");

}

var a = 5;

function a() {

console.log("yy");

}

//運行結(jié)果:'function a() { console.log("yy"); }'

/*

原因:

我們發(fā)現(xiàn)變量a和兩個方法a()同名了,這時骇扇,js在預(yù)處理的時候

會優(yōu)先將函數(shù)保存到window對象中,然后如果發(fā)現(xiàn)同名的是

變量面粮,這時它會忽略這個變量少孝;如果發(fā)現(xiàn)同名的是函數(shù),那

么后面的會將前面的覆蓋熬苍。所以執(zhí)行alert彈出的會是函數(shù)

*/

/*************************************************************/

alert(b);

var b = 5;

var b = function () {

console.log("xx");

}

//運行結(jié)果:undefined

/*

原因:

我們知道稍走,定義一個方法有多種形式袁翁。像上面這個案例中,

我們的函數(shù)是匿名的婿脸,然后賦值給了一個變量粱胜。但變量終究

是變量,js不會因為它的值比較特別就特殊對待狐树,所以焙压,在

js在預(yù)處理的時候,先將第一個變量b保存到window中抑钟,此時

變量b=undefined,然后第二個變量b覆蓋了第一個變量涯曲,此時

的變量b依然還是等于undefined,所以在程序運行的時候彈出

值會等于undefined在塔。

*/


function c(num1){

alert(num1);

}

c(2);

//運行結(jié)果:2

function d(num2){

alert(num2);

var num2 = 5;

}

d(2);

//運行結(jié)果:2

/*

原因:

在運行前幻件,我就猜想彈出的這個應(yīng)該是一個undefined的

可沒想到卻是2,這使我百思不得其解蛔溃。于是請教老師得

出答案绰沥。

在js預(yù)處理的時候讀取到了這個函數(shù)有一個參數(shù),于是就

直接將這個參數(shù)放到了詞法對象中贺待,這是這個參數(shù)的值是

undefined徽曲,之后它繼續(xù)向下掃描,發(fā)現(xiàn)有一個變量定義狠持,

但我們卻發(fā)現(xiàn)這變量與參數(shù)同名疟位,這個時候js會怎么做?

這時按照之前所學(xué)的喘垂,這個變量會被加到詞法對象中甜刻,而

事實上也的確是加了,不過卻給它打上了一個標簽正勒,用來

標識這個變量是一個參數(shù)得院,這時這個變量的值也是undef-

ined。當(dāng)程序真正運行的時候章贞,我們把參數(shù)傳過去祥绞,這個

參數(shù)就會賦值的到這個參數(shù)中,然后彈出結(jié)果鸭限,然后再賦

值為5蜕径。

接下來還有幾個問題

1.看下面代碼

funciton f(num){

alert(num);

funciton num(){

}

}

f(6);

返回結(jié)果為:'funciton num(){}'

像出現(xiàn)上面這個情況的時候,js也還是一樣在預(yù)處理的時

候败京,將參數(shù)放到詞法對象中兜喻,然后發(fā)現(xiàn)里面有一個同名的

函數(shù),這時js就會把這個函數(shù)放到詞法對象中赡麦,并覆蓋之

前的參數(shù)朴皆,而它的值指向的就是這個函數(shù)帕识。當(dāng)我們程序真

正運行時,我們把參數(shù)傳過去遂铡,js在這里并不會把6這個參

數(shù)值賦值給這個形參肮疗。

(哎呀,一不小心忘了扒接,明天再去問問老師伪货,這里先不嗶嗶,日后補上V樵觥)

*/

</script>


理解上可能會有些錯誤超歌,不喜勿噴!

覺得還好蒂教,記得點個贊哦巍举!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市凝垛,隨后出現(xiàn)的幾起案子懊悯,更是在濱河造成了極大的恐慌,老刑警劉巖梦皮,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件炭分,死亡現(xiàn)場離奇詭異,居然都是意外死亡剑肯,警方通過查閱死者的電腦和手機捧毛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來让网,“玉大人呀忧,你說我怎么就攤上這事±6茫” “怎么了而账?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長因篇。 經(jīng)常有香客問我泞辐,道長,這世上最難降的妖魔是什么竞滓? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任咐吼,我火速辦了婚禮,結(jié)果婚禮上商佑,老公的妹妹穿的比我還像新娘锯茄。我一直安慰自己,他們只是感情好莉御,可當(dāng)我...
    茶點故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布撇吞。 她就那樣靜靜地躺著,像睡著了一般礁叔。 火紅的嫁衣襯著肌膚如雪牍颈。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天琅关,我揣著相機與錄音煮岁,去河邊找鬼。 笑死涣易,一個胖子當(dāng)著我的面吹牛画机,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播新症,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼步氏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了徒爹?” 一聲冷哼從身側(cè)響起荚醒,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎隆嗅,沒想到半個月后界阁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡胖喳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年泡躯,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丽焊。...
    茶點故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡较剃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出粹懒,到底是詐尸還是另有隱情重付,我是刑警寧澤,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布凫乖,位于F島的核電站确垫,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏帽芽。R本人自食惡果不足惜删掀,卻給世界環(huán)境...
    茶點故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望导街。 院中可真熱鬧披泪,春花似錦、人聲如沸搬瑰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至艾少,卻和暖如春卡乾,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背缚够。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工幔妨, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谍椅。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓误堡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親雏吭。 傳聞我的和親對象是個殘疾皇子锁施,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,509評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 總是感覺JavaScript的基礎(chǔ)很差,說會也會說不會還真就不會思恐,溫故而知新沾谜,最近就開始復(fù)習(xí)起來,對解析與執(zhí)行過程...
    Creator93閱讀 627評論 0 8
  • 第一章: JS簡介 從當(dāng)初簡單的語言胀莹,變成了現(xiàn)在能夠處理復(fù)雜計算和交互基跑,擁有閉包、匿名函數(shù)描焰, 甚至元編程等...
    LaBaby_閱讀 1,654評論 0 6
  • 了解js面向?qū)ο缶幊讨跋狈瘢紫纫私鈐s的執(zhí)行順序。js的解析過程分為兩個階段:預(yù)處理階段與執(zhí)行期荆秦。 預(yù)處理階段 ...
    Allin_Lin閱讀 232評論 0 1
  • 《ijs》速成開發(fā)手冊3.0 官方用戶交流:iApp開發(fā)交流(1) 239547050iApp開發(fā)交流(2) 10...
    葉染柒丶閱讀 5,093評論 0 7
  • 繼承 一篱竭、混入式繼承 二、原型繼承 利用原型中的成員可以被和其相關(guān)的對象共享這一特性步绸,可以實現(xiàn)繼承掺逼,這種實現(xiàn)繼承的...
    magic_pill閱讀 1,054評論 0 3