婷婷久久综合九色综合,欧美成色婷婷在线观看视频,偷窥视频一区,欧美日本一道道一区二区

<tt id="bu9ss"></tt>
  • <span id="bu9ss"></span>
  • <pre id="bu9ss"><tt id="bu9ss"></tt></pre>
    <label id="bu9ss"></label>

    當前位置:首頁 >  站長 >  編程技術 >  正文

    淺談JavaScript 聲明提升

     2020-10-28 14:19  來源: 腳本之家   我來投稿 撤稿糾錯

      阿里云優(yōu)惠券 先領券再下單

    這篇文章主要介紹了JavaScript 聲明提升的相關資料,幫助大家更好的理解和學習JavaScript,感興趣的朋友可以了解下

    1 引例及基本原理

    在學習JavaScript聲明提升之前,我們先看下面這個例子:

    console.log(a);
    var a=2;

    運行結果會是什么?你可能會有以下的猜測:

    1.報錯ReferenceError: a is not defined;

    2.打印2;

    3.打印undefined。

    正確的結果是第三種,打印undefined。

    下面讓我們來看看具體的原因。其實,對于var a=2;這條語句,JavaScript會將其視為兩個聲明:

    定義聲明var a,會在編譯階段進行;

    賦值聲明a=2,會留在原地等待執(zhí)行階段進行。

    而所謂的聲明提升:就是JavaScript會把var變量聲明和函數聲明都會被提升到各自作用域的頂部,而賦值操作并不會被提升。

    因此,上面的例子實際是按照這樣的流程來處理:

    var a;
    console.log(a);
    a=2;

    我們還需要知道,不僅僅是var變量聲明會提升,函數聲明同樣也會提升,現在來看下面這個例子

    foo();
    function foo(){
     console.log(a);
     var a=2;
    }

    這個例子的運行結果為:打印undefined。這段代碼實際上會被理解為為下面的形式:

    function foo(){
     var a;
     console.log(a);
     a=2;
    }
    foo();

    2 關于聲明提升的常見問題

    2.1 函數表達式

    先看一個函數表達式的例子:

    console.log(foo);
    var foo=function(){}

    上面代碼的運行結果為:打印undefined。實際上,變量標識符foo被提升了,但它的賦值操作并沒有被提升,我們可以理解為下面的形式:

    var foo;
    console.log(foo);
    foo=function(){}

    結論:函數聲明會被提升,但函數表達式不會被提升。

    2.2 聲明的優(yōu)先級

    function a(){}
    var a;
    console.log(a);

    var a;
    function a(){}
    console.log(a);

    如果在同一個作用域內,存在同名的函數聲明和var變量聲明,那么會發(fā)生什么樣的情況呢?我們同樣再來看一個例子:

    上面的兩種寫法,運行結果均為打印a(){}。也就是說,如果在同一個作用域內,存在同名的函數聲明和var變量聲明,則函數聲明的優(yōu)先級更高。

    還有一種情況:如果同一個作用域內,存在多個同名的函數聲明。這種情況下,后面聲明的會覆蓋前面聲明的。

    3 練習題

    3.1 第一題

    var getName;//與函數聲明同名,故失效
    function getName() {
     console.log(2);
    }
    getName = function() {//賦值
     console.log(1);
    };
    getName();

    答案:打印1

    解析:提升后的順序如下

    3.2 第二題

    var a = 1;
    function b(){
     a = 10;
     return;
     function a(){
      console.log(a);
     }
    }
    b();
    console.log(a);

    答案:打印1

    解析:首先,我們需要梳理清楚聲明的提升。

    本題有幾個關鍵點,我們需要明白:

    函數b內的a函數雖然在return之后,但它并沒有失效,它會發(fā)生聲明提升,從而提升到b函數作用域的頂部。

    很多童鞋(比如我TAT)可能會錯誤地認為這題的答案是10,認為我們在最后調用了b函數,修改了全局變量a。實際上,由于函數a發(fā)生了聲明提升,導致在函數b內“遮蔽”了全局作用域中的變量a,因此,a=10;其實是將函數a重新賦值。為了進一步測驗,大家可以把a函數注釋掉,會發(fā)現此時的答案就變成了10。

    注:本題還涉及到了閉包的相關知識,這一題詳細的解析請見參考資料[2],講得非常詳細。

    var a;//全局變量a發(fā)生了聲明提升
    function b(){
     function a(){//函數a發(fā)生聲明提升
       console.log(a);
      }
     a = 10;//因為函數a離它最近,因此賦值給函數a
     return;
    }
    a = 1;//賦值給了全局變量a
    b();
    console.log(a);

    4 參考資料

    [1] 《你不知道的JavaScript》

    [2] js中變量名與函數名重名的問題,Charles_Tian

    [3] 函數聲明與變量聲明的提升機制優(yōu)先級問題,一個菜鳥的奮斗史

    以上就是淺談JavaScript 聲明提升的詳細內容,更多關于JavaScript 聲明提升的資料請關注腳本之家其它相關文章!

    來源:腳本之家

    鏈接:https://www.jb51.net/article/195552.htm

    申請創(chuàng)業(yè)報道,分享創(chuàng)業(yè)好點子。點擊此處,共同探討創(chuàng)業(yè)新機遇!

    相關標簽
    javascript
    java

    相關文章

    • 參加Java培訓班有用嗎?這個問題大家要怎么看待

      在眾多的編程培訓中,Java軟件開發(fā)作為老牌兒的編程主流,從發(fā)展前景上看,無論是現在還是將來,依然會持續(xù)火爆的狀態(tài)。對于當下年輕人想要快速的掌握這項技術,進入到這個行業(yè),最為熱議的話題是“參加Java培訓班有用嗎”。小編可以肯定的回答,是有用的,學習的根據來自于興趣,如果大家是真的熱愛這行,在加上專

      標簽:
      java
    • 動力節(jié)點南京Java培訓口碑教學,滿分教學就業(yè)體驗

      江南佳地,邂逅金陵,動力節(jié)點南京Java培訓校區(qū),為長三角地帶的發(fā)展注入專業(yè)Java教培力量,動力節(jié)點自09年成立至今,專注Java培訓教學,一直秉承著“為學員服務”的唯一教育理念,堅持口碑教學,被業(yè)界稱為“口口相傳的Java培訓黃埔軍?!薄?/p>

      標簽:
      java
      java培訓
    • 動力節(jié)點廣州Java培訓,為大家撐起一個IT的未來

      廣州動力節(jié)點Java培訓機構,一直以來專注Java的教學,深耕教育,穩(wěn)扎穩(wěn)打,在行業(yè)具有“口口相傳的黃埔軍?!敝Q,有句話說的好“沒有量變的積累,哪來質變的飛躍”動力節(jié)點和你一起,扎扎實實做教育,你們扎扎實實學本領,時刻準備著,有朝一日,風自會來。

      標簽:
      java
      在線培訓
    • 動力節(jié)點成都Java培訓招生源于口碑,業(yè)界巨頭

      為了能夠搭乘互聯網的快車,實現人生的逆轉,不少年輕人選擇動力節(jié)點成都Java培訓,動力節(jié)點作為Java職業(yè)培訓,沒有理由不去擔起這份沉甸甸的信任,所以,自09年創(chuàng)立起,一直專注于Java的教學,將全部的資源

      標簽:
      java
      培訓機構
    • 參加動力節(jié)點北京Java培訓會讓學者更加有信心

      通過Java培訓出來的同學與沒參加過培訓的同學差距還是有不少的,同學一直以來對參加培訓都保持著猶豫的心態(tài),其實大家了解后會發(fā)現,不管是對零基礎還是有編程認知的同學來講,參與更加密集、系統化的培訓

      標簽:
      java
      培訓機構

    熱門排行

    信息推薦