JS函式宣告和函式表示式的區別
阿新 • • 發佈:2018-12-30
另一方面,仔細看一看產生規則也會發現,唯一可能讓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
}
};