關(guān)于js的變量,開始的時(shí)候我們都會(huì)被告知,變量聲明應(yīng)該在引用該變量之前。關(guān)于為什么要這樣做呢,開始的時(shí)候本著會(huì)用就行的目的,也沒去深究。不過后來經(jīng)常會(huì)發(fā)現(xiàn)一些讓人很費(fèi)解的。。姑且稱為現(xiàn)象吧。先看一段代碼再說:

function a(){
    alert(a);    var a = 'b'}
a();//undefined

  此時(shí)就會(huì)發(fā)現(xiàn)不遵守規(guī)則的下場(chǎng)了,結(jié)果不是你想要的。。當(dāng)然我們不能說只知道要怎么寫就行了。要知其然也要知其所以然,究其原因,就涉及到兩個(gè)概念js作用域和詞法分析了。

  都知道js中不存在類似于c++等語(yǔ)言的塊級(jí)作用域,例如for循環(huán)中定義的變量,其實(shí)是屬于當(dāng)前對(duì)象下的屬性,同一對(duì)象下可以隨便訪問。只有函數(shù)可以限定一個(gè)變量的作用范圍,即函數(shù)才是變量的作用域。對(duì)于函數(shù)的變量訪問時(shí)遵循作用域鏈的。

  js自上而下的執(zhí)行過程分為兩個(gè)詞法分析執(zhí)行兩個(gè)階段:詞法分析主要包括:分析形參、分析變量聲明、分析函數(shù)聲明三個(gè)部分(具體關(guān)于js詞法分析這里知識(shí)簡(jiǎn)單說明,請(qǐng)查看我的另一篇文章http://www.cnblogs.com/pqjwyn/p/5365532.html)。通過詞法分析將我們寫的js代碼轉(zhuǎn)成可以執(zhí)行的代碼,接下來才是執(zhí)行。

  經(jīng)過詞法分析的后兩個(gè)步驟,會(huì)將存在的變量聲明和函數(shù)聲明,進(jìn)行一番處理。具體拿上面的代碼做個(gè)例子(只分析變量的部分):

      1、分析形參:此處沒有,直接略過(本文只分析變量部分,要是要看完整的部分可以轉(zhuǎn)到

網(wǎng)友評(píng)論