部屋とYシャツと私と俺とお前と大五郎。javascriptでおなじみの関数周りの仕様について、昔からMDCに詳しく載っていたのですが、ようやく実感できてきたので、自分用解釈メモ。
function 文
function multiply(x, y) { return x * y; }
- 同時にその関数名と同じ名前の変数を作成する
- 「関数名」と「その関数が代入された変数名」は違う(!)
- 定義されたスコープ内ではその名前でアクセス可能
- 宣言より前に使える(parseの時点でインスタンスができる?)
function 式 (function 演算子)
var multiply = function(x, y) { return x * y; }
- 実行時にインスタンスができるのでこの式より前にmultiply()では使えない
- 現在のスコープを継承する(=クロージャを形成する)
Function コンストラクタ
var multiply = new Function("x", "y", "return x * y;");
- 関数名を持たない。SpiderMonkeyは内部的に”anonymous”としている。
- グローバルスコープのみ
- ("x", "y", "return x * y;") が呼ばれるたびにparseされるからすんごい遅い
- あんまり使わないほうがいいよ、とMDCも言っている
じゃあ要らねーじゃん!と思うかも知れませんが、文を動的に生成できるのが強み。