1. 程式人生 > >JS函式宣告和函式表示式的區別

JS函式宣告和函式表示式的區別

    另一方面,仔細看一看產生規則也會發現,唯一可能讓Expression(表示式)出現在Block(塊)中情形,就是讓它作為ExpressionStatement(表示式語句)的一部分。但是,規範明確規定了ExpressionStatement(表示式語句)不能以關鍵字function開頭。而這實際上就是說,FunctionExpression(函式表示式)同樣也不能出現在Statement(語句)或Block(塊)中(別忘了Block(塊)就是由Statement(語句)構成的)。 由於存在上述限制,只要函數出現在塊中(像上面例子中那樣),實際上就應該將其看作一個語法錯誤,而不是什麼函式宣告或表示式。 那麼我們應該在什麼時候使用函式宣告或函式表示式呢?函式宣告只能出現在“程式程式碼”中,意味著只能在其它函式體中或者全域性空間;它們的定義不能不能賦值給一個變數或屬性,或者作為一個引數傳遞出現在函式呼叫中;下面的例子是函式宣告的允許的用法,foo(),bar()和local()都是通過函式宣告模式宣告: // 全域性環境 function foo() {}   function local() {   // 區域性環境       function bar() {}           return bar;   }   當你在語法上不能使用函式宣告的時候,你就可以使用函式表示式。比如:傳遞一個函式作為引數或者在物件字面量中定義一個函式:   // 這是一個匿名函式表示式 callMe(function () {     //傳遞一個函式作為引數 });     // 這是一個具名函式表示式 callMe(function me() {      // 傳遞一個函式作為引數,函式名為me });     // 其他函式表示式 var myobject = {       say: function () {     // I am a function expression   }   };