【发布时间】:2016-12-04 08:36:22
【问题描述】:
我在传递 kata 时遇到问题。我相信我在正确的轨道上,但不完全了解如何检索所需的结果。
说明
编写一个方法,该方法接受一个函数和该函数的参数并返回另一个函数,该函数在调用时返回使用提供的参数调用的原始函数的结果。
给出的示例
给定一个函数添加
function add (a, b) {
return a + b;
}
可以让它变得懒惰:
var lazy_value = make_lazy(add, 2, 3);
该表达式目前不会被评估,但只有当您调用lazy_value 时:
lazy_value() => 5
这是我半天努力的结论
var make_lazy = function () {
var innerFunction = null;
var array = [];
for (var i = 0; i < arguments.length; i++) {
if (typeof arguments[i] == 'function') {
innerFunction = arguments[i];
} else {
array.push(arguments[i]);
}
}
innerFunction.apply(innerFunction, array);
innerFunction();
};
我正在使用arguments 和apply() 并认为我很接近?但是我在测试结果中得到了TypeError: lazy_sum is not a function at Object.exports.runInThisContext。任何帮助,特别是了解正在发生的事情,都值得赞赏。谢谢
【问题讨论】:
-
最后两行调用
innerFunction两次。 -
除了 Felix Kling 指出的问题之外,如果您的 innerFunction 的一个参数也是一个函数,会发生什么情况? (提示:哎呀!)我通常不会这样做,但由于你自己如此接近,这里有一个单线你可以作为参考:
let makeLazy = (f, ...args) => x => f(...args); -
你没有从
make_lazy返回函数剧透:function lazy(fn/*, args*/) { return fn.bind.apply(fn, [this].concat([].slice.call(arguments, 1))) } -
感谢大家的帮助。在您的帮助下,我添加了
return function () { innerFunction.apply(innerFunction, array); }并且它起作用了:)。我现在明白我没有正确返回函数,直到现在我才知道我可以这样做。 注意:最后我还删除了innerFunction();
标签: function javascript-objects