我正在玩JS的特性来提高我对语言的理解。
在下面的例子中,我尝试使用call
方法来初始化给定数组对象上的Array函数。然而,我很好奇为什么我写的代码不起作用?。
谢谢你,谢谢你
代码
const f_timeit = (f) => {
return function(...args) {
util.p(`Entering function ${f.name}`);
const start_time = Date.now();
try {
return f(...args);
} finally {
util.p(`Exiting ${f.name} after ${Date.now() - start_time}ms`);
}
}
};
const rarr = [...Array(10000000)].map(e => ~~(Math.random() * 20));
// following works
console.log(f_timeit((arr) => {
return arr.reduce((acc, val) => acc + val, 0);
})(rarr));
// following fails
util.p(f_timeit(Array.prototype.reduce.call)(rarr, (acc, val) => acc + val, 0));
错误:
return f(...args);
^
TypeError: f is not a function
1条答案
按热度按时间r8xiu3jd1#
这个错误消息有点误导人,它并不是说“
f
不是一个函数”,而是说f
是Function.prototype.call
方法,它被调用的对象不是一个函数--特别是undefined
。这是由于how thethis
argument works,特别是accessing methods on an object does not automatically bind them。所以实现你想要的各种方法
但是,我通常建议您更改
f_timeit
,以便在调用返回的函数时考虑传递的this
值:这样,您就可以使用