javascript中函式宣告與函數運算式的區別

來源:互聯網
上載者:User

標籤:匿名函數   javascrip   ima   筆記   區別   alt   代碼   函數運算式   全域   

  javascript中聲明函數的方法有兩種:函式宣告式和函數運算式.究竟他們用起來有什麼區別呢?

 

  區別如下:

  (1)、以函式宣告的方法定義的函數,函數名是必須的,而函數運算式的函數名是可選的。

  (2)、以函式宣告的方法定義的函數,函數可以在函式宣告之前調用,而函數運算式的函數只能在聲明之後調用。

  (3)、以函式宣告的方法定義的函數並不是真正的聲明,他們僅僅可以出現在全域中或者嵌套在其它函數中。

  下面來看具體的例子吧。下面這兩種方式有什麼區別嗎?

  function boo(){};   

  var bar = function(){};

  可能有些人知道,也有些人不知道,對於我而言,我是懵的,所以覺得有必要做下筆記。

  在ECMAScript中,有兩個最常用的建立函數對象的方法,即使用函數運算式或者使用函式宣告。對此,ECMAScript規範明確了一點,即是,即函式宣告 必須始終帶有一個標識符(Identifier),也就是我們所說的函數名,而函數運算式則可以省略。說到這裡,答案就不言而喻了(前一個是函式宣告,後一個是函數運算式)。

  也許有人會問那如果第二種方式也有函數名呢,比如這樣,var bar = function boo(){};其實它還是函數運算式,因為它是賦值表達的一部分。

  函式宣告: 
    function 函數名稱 (參數:可選){ 函數體 } 
  函數運算式: 
    function 函數名稱(可選)(參數:可選){ 函數體 } 

  所以,可以看出,如果不聲明函數名稱,它肯定是運算式,可如果聲明了函數名稱的話,如何判斷是函式宣告還是函數運算式呢?ECMAScript是通過上下文來區分的,如果function boo(){}是作為賦值運算式的一部分的話,那它就是一個函數運算式,如果function boo(){}被包含在一個函數體內,或者位於程式的最頂部的話,那它就是一個函式宣告。

  還有一種函數運算式,就是被括弧括住的(function boo(){}),他是運算式的原因是因為括弧 ()是一個分組操作符,它的內部只能包含運算式。

  下面來看一個有趣的例子:

  

  結果如何呢?剛看到這個的時候,我也做錯了。好了,運行結果是這樣的。

  

  為什麼會這樣呢,因為在第一次調用fn()的同時,var fn 變數沒有作為全域對象的一個屬性而存在,且 fn 引用的匿名函數上下文也沒有被初始化,所以在他之前調用失敗。

  現在把這段代碼稍微調整一下:

  

  結果就會不一樣了。

  

 

javascript中函式宣告與函數運算式的區別

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.