javascriptダイナミック作成関数

1513 ワード

動的作成関数の3つの方法
書式の作成
new Function(arg1,arg2,arg...,body)
Function.call(_,arg1,arg2,arg...,body)
Function.appy(_,[arg1,arg2,arg...,,body])
argNbodyはすべてstringタイプで、_は任意の値であってもよく、彼がどんな役割をしているかは調べられませんでした.Function.applyの2番目のパラメータもarray-like objectであってもいいです.
var body="console.log(this);
return a+b;" new Function("a","b",body) var noop = function(){} //it can be anything, but in avalon.js, it is an empty function. don't know why Function.call(noop,"a","b",body) Function.apply(noop,["a","b",body]) \\result: function anonymous(a,b /**/) { console.log(this); return a+b; }
性能テスト
テストコード
var body = "return a+b;"
var noop = function() {}
var result = []
var averageTime = 0
for (var i = 0; i < 50; i++) {
    var begin = new Date
    for (var j = 0; j < 1000; j++) {
        //Function.call(1, "a"+i, "b"+i, body)//Function.apply(noop,["a"+i,"b"+i,body])//new Function("a"+i,"b"+i,body)
    }
    result.push(new Date - begin)
}

result.reduce(function(pre, curr) {
    return pre + curr
})/50
chromeブラウザバージョン34.0.1847.131 new Function:278.38 Function.apply:277.16 Function.call:274この結果は3つの作成方式の速度を表していません.テストコードを実行するたびに結果が浮動しますが、大体265~285の間に循環回数が高くなれば、chrome consolieでnodeJSの3つの方法の結果が1.xになります.ほとんど無視できます.
締め括りをつける
これは失敗のテストです.