08-JavaScript作用域和預(yù)解析

作用域

  • JavaScript中作用域的概念和C語言一樣, 也分為全局作用域和局部作用域
  • 全局作用域
    • 在任何地方都可以訪問到的就是全局作用域
    • 在script標(biāo)簽中或一個(gè)獨(dú)立js文件中定義的就是全局作用域
<script>
    var num = 10; // 該變量是全局作用域
    function test() { 
        // 在函數(shù)中訪問全局作用域num變量
        console.log("test中"+num);
    }
    test();
    // 在外面訪問全局作用域num變量
    console.log("外部"+num);
</script>
    function test() { // 該函數(shù)是全局作用域
        console.log("test函數(shù)");
    }
    // 在外面訪問全局作用域test函數(shù)
    test();
    function demo() { 
        // 在函數(shù)中訪問全局作用域test函數(shù)
        test();
    }
    demo();
  • 局部作用域
    • 只在固定的代碼片段內(nèi)可訪問到的變量盆均,例如函數(shù)內(nèi)部。對應(yīng)局部作用域(函數(shù)作用域)
    • 寫在函數(shù)內(nèi)部的都是局部作用域, 只能在當(dāng)前函數(shù)內(nèi)訪問
<script>
    function test() {
        var num = 123; // 該變量是局部作用域
        // 可以在同一個(gè)局部作用域中訪問
        console.log("test中"+ num);
    }
    // 不能在局部范圍以外訪問
    console.log("外部"+num);
</script>
<script>
    function test() {
        function demo() { // 該函數(shù)是局部作用域
            console.log("demo函數(shù)");
        }
        // 可以在同一個(gè)局部作用域中訪問
        demo();
    }
    // 不能在局部范圍以外訪問
    demo();
</script>
  • 注意點(diǎn):
  • 如果在函數(shù)中定義變量時(shí),如果不添加var關(guān)鍵字, 這個(gè)變量是一個(gè)全局變量
<script>
    function test() {
        // 企業(yè)開發(fā)千萬不要這么寫
        num = 123;
        console.log(num);
    }
    test();
    console.log(num);
</script>
  • 任何一對花括號({和})中的語句集都屬于一個(gè)塊,在這之中定義的所有變量在代碼塊外都是不可見的番宁,我們稱之為塊級作用域。
  • 在es5之前沒有塊級作用域的的概念,只有函數(shù)作用域,現(xiàn)階段可以認(rèn)為JavaScript沒有塊級作用域

作用域鏈

  • JavaScript代碼中至少有一個(gè)作用域, 即全局作用域。
  • 凡是代碼中有函數(shù)嘱朽,那么這個(gè)函數(shù)就構(gòu)成另一個(gè)作用域。
  • 如果函數(shù)中還有函數(shù)怔接,那么在這個(gè)作用域中就又可以誕生一個(gè)作用域搪泳。
  • 將這樣的所有的作用域列出來,可以形成的結(jié)構(gòu)就稱之為作用域鏈蜕提。
<script>
    var num = 123; // 0級作用域鏈
    function test() { // 0級作用域鏈
        var num = 666; // 1級作用域鏈
        console.log(num);
        function demo() { // 2級作用域鏈
            var num = 777;
            console.log(num);
        }
        demo();
    }
    test();
    console.log(num);
</script>

再直白一點(diǎn): 訪問時(shí)就是C語言中的就近原則


預(yù)解析

  • JavaScript代碼的執(zhí)行是由瀏覽器中的JavaScript解析器來執(zhí)行的森书。
  • JavaScript解析器執(zhí)行JavaScript代碼的時(shí)候,分為兩個(gè)過程:
    • 預(yù)解析過程
    • 代碼執(zhí)行過程
  • 預(yù)解析過程:
      1. 把變量的聲明提升到當(dāng)前作用域的最前面谎势,只會(huì)提升聲明,不會(huì)提升賦值杨名。
      1. 把函數(shù)的聲明提升到當(dāng)前作用域的最前面脏榆,只會(huì)提升聲明,不會(huì)提升調(diào)用台谍。
      1. 先提升var须喂,在提升function。
  • 案例1
<script>
    console.log(num); // undefined
    var num = 123;
</script>
<script>
    // 把變量的聲明提升到當(dāng)前作用域的最前面
    var num;
    console.log(num);
    num = 123;
</script>
  • 案例2:
<script>
    test();
    function test() {
        console.log("hello world");
    }
</script>
<script>
    test();
    alert(test);
    function test() {
        console.log("hello world");
    }
</script>
<script>
    // 把函數(shù)的聲明提升到當(dāng)前作用域的最前面
    function test() {
        console.log("hello world");
    }
    test();
    alert(test);
</script>
  • 預(yù)解析練習(xí)
    var num = 123;
    fun();
    function fun() {
        console.log(num);
        var num = 666;
    }
    /*
    var num;
    function fun() {
        var num;
        console.log(num);
        num = 666;
    }
    num = 123;
    fun();
    */
    var a = 666;
    test();
    function test() {
        var b = 777;
        console.log(a);
        console.log(b);
        var a = 888;
    }
    /*
    var a;
    function test() {
        var b;
        var a;
        b = 777;
        console.log(a);
        console.log(b);
        a = 888;
    }
    a = 666;
    test();
    */
  • 注意點(diǎn):
    • 變量和函數(shù)同名時(shí), 函數(shù)的優(yōu)先級高
<script>
    console.log(num);
    function num() {
        console.log("hello world");
    }
    var num = 666;
    console.log(num);

    /*
    function num() {
        console.log("hello world");
    }
    var num;
    console.log(num);
    num = 666;
    console.log(num);
     */
</script>

不同方式定義函數(shù)區(qū)別

  • 預(yù)解析時(shí)提升的方式不同
<script>
    // 1.函數(shù)聲明
    test();
    function test() {
        console.log("指趣學(xué)院");
    }
    // 2.函數(shù)表達(dá)式
    demo(); // 報(bào)錯(cuò)
    var demo = function () {
        console.log("www.it666.com");
    }
    /*
    function test() {
        console.log("指趣學(xué)院");
    }
    var demo;
    test();
    demo();
    demo = function () {
        console.log("www.it666.com");
    }
     */
</script>
  • 新舊版本瀏覽器預(yù)解析處理方式不同
<script>
    /*
    在新版本瀏覽器中, 代碼塊中的函數(shù)不會(huì)被提升
    在舊版本瀏覽器中, 代碼塊中的函數(shù)會(huì)被提升
    新版本輸出"指趣學(xué)院"
    老版本輸出"www.it666.com"
     */
    if(true){
        function test() {
            console.log("指趣學(xué)院");
        }
    }else{
        function test() {
            console.log("www.it666.com");
        }
    }
    test();
</script>
<script>
    var test;
    if(true){
        test = function () {
            console.log("指趣學(xué)院");
        }
    }else{
        test = function() {
            console.log("www.it666.com");
        }
    }
    test();
</script>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末趁蕊,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌间护,老刑警劉巖雳攘,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異任柜,居然都是意外死亡卒废,警方通過查閱死者的電腦和手機(jī)沛厨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來摔认,“玉大人逆皮,你說我怎么就攤上這事〔胃ぃ” “怎么了电谣?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長抹蚀。 經(jīng)常有香客問我剿牺,道長,這世上最難降的妖魔是什么况鸣? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任牢贸,我火速辦了婚禮,結(jié)果婚禮上镐捧,老公的妹妹穿的比我還像新娘潜索。我一直安慰自己,他們只是感情好懂酱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布竹习。 她就那樣靜靜地躺著,像睡著了一般列牺。 火紅的嫁衣襯著肌膚如雪整陌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天瞎领,我揣著相機(jī)與錄音泌辫,去河邊找鬼。 笑死九默,一個(gè)胖子當(dāng)著我的面吹牛震放,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播驼修,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼殿遂,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了乙各?” 一聲冷哼從身側(cè)響起墨礁,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎耳峦,沒想到半個(gè)月后恩静,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡妇萄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年蜕企,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了咬荷。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡轻掩,死狀恐怖幸乒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情唇牧,我是刑警寧澤罕扎,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站丐重,受9級特大地震影響腔召,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜扮惦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一臀蛛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧崖蜜,春花似錦浊仆、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至等恐,卻和暖如春洲劣,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背课蔬。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工囱稽, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人二跋。 一個(gè)月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓粗悯,卻偏偏與公主長得像,于是被迫代替她去往敵國和親同欠。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

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