JavaScript の関数には、宣言と式の 2 種類があります。
両者の違いは次のとおりです。
- 関数宣言が巻き上げられます。これは、JavaScript の宣言が巻き上げられるので、プログラムに現れる前に関数を呼び出すことができることを意味します。
- 関数式はすぐに呼び出すことができます。関数宣言はできません。これは、式が値を表す(または値を返す) ためです。関数式は関数を表現します。
関数宣言の例:
foo("bar");
function foo(bar) {
alert("foo" + bar);
}
foo
は関数宣言なので、上記のプログラムは動作します。
foo("bar"); // throws an error, foo is undefined - not a function
var foo = function (bar) {
alert("foo" + bar);
};
上記のプログラムは、 as としてfoo
宣言されundefined
、巻き上げられ、後で関数式の値が割り当てられたままでは機能しません。したがってundefined
、それは呼び出されたときです。
関数式の例:
(function (bar) {
alert("foo" + bar);
}("bar"));
上記の関数は関数式であるため、すぐに呼び出されます。
function (bar) {
alert("foo" + bar);
}("bar"); // throws an error, can't call undefined
上記の関数は関数宣言であるため、すぐには呼び出されません。宣言は表現 (または値を返す) ではないことに注意してください。undefined
つまり、関数として呼び出そうとするようなものです。
関数はどのように式になりますか?
式が期待されるコンテキストで関数が使用されている場合、それは式として扱われます。それ以外の場合は、宣言として扱われます。
次の場合に式が期待されます。
- 変数に値を代入しています (つまり
identifier = expression
)。
- 括弧内 (つまり
( expression )
)。
- 演算子のオペランドとして (つまり
operator expression
)。
したがって、以下はすべて関数式です。
var foo = function () {};
(function () {});
~function () {};
それ以外はすべて関数宣言です。つまり、関数の前に何もない場合、それは宣言です。
このコードを参照してください: https://github.com/aaditmshah/codemirror-repl/blob/master/scripts/index.js#L94
次の関数isExpression
は、任意の JavaScript コードが式であるかどうかをテストするために使用されます。
function isExpression(code) {
if (/^\s*function\s/.test(code)) return false;
try {
Function("return " + code);
return true;
} catch (error) {
return false;
}
}
これであなたの心の疑問が解消されることを願っています。
要するに:
- 関数式は、値 (この場合は関数) を表現または返します。したがって、すぐに呼び出すことはできますが、プログラムに表示される前に呼び出すことはできません。
- 関数宣言が巻き上げられます。したがって、プログラムに表示される前に呼び出すことができます。ただし、値を表現しないため、すぐに呼び出すことはできません。