Functionコンストラクタの遅さ
関数式と関数宣言で定義された関数は一度しか解析されませんが、Function コンストラクタで定義された関数はそうではありません。
https://developer.mozilla.org/ja/Core_JavaScript_1.5_Reference/Functions
つまり、Function コンストラクタに渡された関数本体を表す文字列が、評価されるたびに必ず解析されます。
関数式は毎回クロージャを作成しますが、関数本体は再解析されないので、"new Function(...)" よりは関数式の方がまだ高速です。
したがって Function コンストラクタはできる限り避けるべきでしょう。
どのくらい遅くなるのか試してみた
a = new Function("x","return x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x"); b = function(x){return x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x+x;}; function test(f){ t = new Date(); for(i=0;i<999999;i++) f(1); return new Date() - t + 'ms'; }
手元のマシン+Firefox3での実行結果
test(a) | 7562ms |
test(b) | 7532ms |
あまり変わらない。なんかやり方間違ってるかな…