首先说一下这个问题是怎么产生的:今天看排序算法,想要比较不同的排序算法的时间花费。
最简单的时间统计方法是在程序块开始和结束时分别计时,求一下时间差就能得出该段代码的耗时。
如:
var foo = function (a, b) { return a + b } var t1 = new Date() foo(1, 2) console.log("cost time:", new Date() - t1)
但是这样有个缺点就是,每测试一个函数,都要写一遍
var t1 = new Date() ....... console.log("cost time:", new Date() - t1)
于是就想写一个函数,可以对被调用的函数性能进行测试。
var foo = function () { console.log("foo") } var timer = function (bar) { var t1 = new Date() var res = bar() console.log("cost time:", new Date() - t1) return res } timer(foo)
但是这样存在一个问题,如果foo本身是携带参数的,我们该如何传入它的参数呢?
var foo = function (a, b) { console.log(a + b) } var timer = function () { var t1 = new Date() var res = this.apply(null, arguments) console.log("cost time:", new Date() - t1) return res } timer.call(foo, 1, 2)
其中,call里面第一个参数就是我们要调用的函数,后面的参数就是对应被调函数的参数。这样就实现了函数作为另一函数的参数的功能!