関数式2です
関数式にも名前を付けることができます。関数式の名前は、関数本体のスコープ内にのみ含まれます1。(ECMAScript 第 5 版では が廃止さarguments.callee
れるため、これが再帰的な「無名」関数を記述する唯一の簡単な方法です。)
これは関数式であるため、名前によって外部スコープに新しいバインディングが導入されることはありません。
また、すべての関数は JavaScript のオブジェクトです。ではf(..)
、で「呼び出される」前f
に評価されます。関数に評価されなかった場合、エラーがスローされます。これが、単なる関数であるコールバックが変数によって名前を付けられ、パラメーターとして渡される理由です。(..)
f
また、プロトタイプに関する仮定/主張を確認してください。
var abc = function def() {}
abc.prototype === abc // -> false
abc.name // -> "def"
1 Bergi の回答を参照してください。
2どちらがどれであるかを簡単に見分ける方法は?
ほとんどのエンジンは [誤って] Function Declaration をStatementとして解析しますが、文法規則はそれがSourceElementの場合にのみfunction ..
Function Declaration として解析することを許可します。SourceElement 生成は、プログラムの最上位の「ブロック」または関数の最上位の「ブロック」でのみ発生します。
いずれにせよ、Expressionが必要なfunction ..
場所に が現れると、関数式として解析されます。すべて関数式として解析される例:
// Can only assign values: Statements do not have values!
var f = function () {}
var g = function gName () {} // see Bergi's answer
// Can only pass values: Statements do not have values!
doIt(function () {}) // callback / "anonymous function"
// IIFE: Immediately-Invoked Function Expression
;(function () {})() // standard IIFE
;(function () {} ()) // alternative standard IIFE
;+function () {} () // curious way to write an IIFE
// basically you can use any unary operator to turn it into an expression not only
// + but also - ! ~ and so on which will modify the return value accordingly
ポイントは、上記のすべてのケースで、が式を必要とfunction ..
する文法の場所に出現するため、関数式として解析されることです。(上記の行の先頭にあるセミコロンは、ASI での「あいまいさ」を回避します。これは、私が好むセミコロンのないスタイルで記述するときに必要です。)
でも。;function () {} ()
両方とも;function f () {} ()
無効な構文です-なぜですか? ;-)