興味深いことに、速度/機能の違いはありますか
function foo(bar) {
alert("foo" + bar);
}
と
var foo = function(bar) {
alert("foo" + bar);
};
興味深いことに、速度/機能の違いはありますか
function foo(bar) {
alert("foo" + bar);
}
と
var foo = function(bar) {
alert("foo" + bar);
};
速度に大きな違いはありません。(テスト)
機能の違いがあります。
「関数宣言」と「関数式」を比較すると、このトピックについて多くの話があります(一部は正しいものもあります)。
しかし簡単に:
最初の例のような関数宣言は、ステップバイステップのコードが実行される前に、実行カーソルがその包含スコープ(包含関数またはグローバルスコープ)に入るときに発生します。したがって、処理時に段階的なコードが実行されていないため、非機能ブロック(、など)内に表示することはできませんif
。try
関数の名前は、それが表示されるスコープに追加され、関数オブジェクトには実際の名前が付けられます(その名前を照会する標準的な方法はありませんが、スタックトレースなどで引き続き役立ちます)。(注:一部のJavaScriptエンジンはブロック内で関数宣言を許可しますが、それは無効であり、それらが行うことは必ずしも一貫しているとは限りません。それを行わないでください。)
2番目の例のような関数式は、すべての式と同様に、コードのステップバイステップのフローで検出されると発生します。式は、関数の名前を明示的に指定しないため、無名関数式と呼ばれます。ES5以前では、結果の関数に名前がないことを意味していました。ES6 / ES2015以降では、無名関数式で作成された多くの関数には名前があります。これは、名前が式から推測できるためです。これは、関数が変数の名前で終わる例の場合です。foo
。無名関数の式は式であるため、式が発生する可能性のある場所であればどこでも発生する可能性がありますが、パーサーにそれを実行していることを警告する必要がある場合もあります。
これを行う3番目の方法があります。匿名ではなく名前付き関数式です。彼らはこのように見えます:
var foo = function bar() {
};
また
var obj = {
foo: function bar() {
}
};
また
doSomething(function bar() { });
等
それらは以前は本当に問題のあるクロスブラウザでした(たとえば、IE8以前はそれらを台無しにしました。Safariの初期バージョンには問題がありました。Kangaxには以前の問題の良いページがあります)。これは式なので、式がある場所ならどこでも有効です。関数名(私のbar
例では)は、準拠するJavaScriptエンジンによって包含スコープに追加されません。