js中函數function的三種定義方式,聲明式定義函數、函數表達式、立即執行函數的區別


轉載:https://www.cnblogs.com/tu-0718/p/9584184.html

 

 

 

 

 

 

  可能光這樣看,有些小伙伴會有些蒙蔽,不知道到底有什么區別? 

  請大家先看下面的代碼:

復制代碼
    <script>
            y();

            function y() {
                alert(2);
            };

            x();
            var x = function() {
                alert(1);
            };
        </script>
復制代碼

  

   上面的代碼運行以后,會先執行y()方法,並彈出2;然后在執行x()方法,但這里會報錯:x is not a function

  為什么會是這樣的呢? 這就是函數定義2種方法的不同造成的。

 

   上述y(),也就是定義函數的第一種方法 (官方稱為-聲明式定義函數)

   大家知道JS變量是有變量聲明提前的,其實函數也是有函數名聲明提前的。

   (另外,函數內部用var聲明的局部變量也會把聲明提前到函數代碼頂部)

   瀏覽器是從上到下開始解析,但因函數名聲明提前(當沒有解析到該方法代碼之前,會自動提升到代碼頂部,固能全局調用該方法)

   盡管這個時候還沒有解析到y()方法的代碼,依然可以先調用該方法。所以y()方法會順利執行,也不會報錯。

 

   上述x(),也就是定義函數的第二種方法(官方稱為-函數表達式):

   而x()方法則會報錯提示:x is not a function, 因為第二種函數定義的寫法,不會讓函數名聲明提前。

   所以,瀏覽器從上往下執行,要先執行x()方法的代碼,然后才能調用,比如下面這樣就不會報錯
      
    var x = function() {
                alert(1);
            };
    x();

   推薦第二種方式定義函數 

   注:函數表達式需要在語句的結尾加上分號,表示語句結束。而聲明式定義函數在結尾的大括號后面不用加分號

 

   補充:還有一種函數寫法,官方稱為(立即執行函數);

   有 3 種 寫法(推薦第一或第二種):

復制代碼
     (function(){
            alert(1);
        })();
        
        (function(){
            alert(2);
        }());
        
        !function(){
            alert(3);
        }();
復制代碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM