动态创建函数的3种方法
创建格式
new Function(arg1,arg2,arg...,body)
Function.call(_,arg1,arg2,arg...,body)
Function.appy(_,[arg1,arg2,arg...,,body])
argN
,body
都是string类型,_
可以为任意值,没查出来他有什么作用
Function.apply的第二个参数也可以是array-like object
例子
var body="console.log(this);\nreturn 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.131new Function
: 278.38Function.apply
:277.16Function.call
:274
这个结果并不能代表三众创建方式的快慢,因为每次运行测试代码结果浮动有些大,但大体上都在265~285之间,循环次数如果设高的话,在chrome console 会挂掉
nodeJS
三种方法的结果在1.x,几乎可以忽略不计
总结
这是个失败的测试!