假设我将不同的数据传递到不同位置的函数中,以解决某些遗留决策/代码。
var partialFunction;
if(thisSituationIsCrazy(data, value)) {
partialFunction = _.partial(originalFunciton, data)
} else {
partialFunction = _.partialRight(originalFunction, value)
}
有没有办法确定实际传入的值和函数中的哪个位置?这仅用于调试目的。
我希望有类似partialFunction.arguments
之类的内容或某些内容,以便了解它所处的位置,因为实际情况比我的例子更复杂。
我根本没有找到基于lodash docs或source code的方法。我也没有在任何有关此主题的博客中看到这一点。
答案 0 :(得分:1)
显然,这是在函数内部实现的,当你调用最终的回调时,它会从close更接近实际函数,而且不会暴露。
但是,如果你真的想要这样,你可以继续为你的目的包装:
//your wrapping inside a IIFE (Immediately-Invoked Function Expression)
(function() {
var _partial = _.partial,
_partialRight = _.partialRight;
_.partial = function() {
var args = Array.from(arguments).slice(1),
ret = _partial.apply(_, arguments);
ret.args = args;
return ret;
}
_.partialRight = function() {
var args = Array.from(arguments).slice(1),
ret = _partialRight.apply(_, arguments);
ret.args = args;
return ret;
}
})();
//now a demo of what you want
function greet(a, b, c) {
return a + ' ' + b + ' ' + c;
}
var sayHelloTo = _.partial(greet, 'hello', 'Stack');
console.log('Arguments passed already:', sayHelloTo.args);
console.log('Execution works perfctly:', sayHelloTo('Overflow'))

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
&#13;
答案 1 :(得分:1)
在函数式编程中有一个//now a demo of what you want
function greet(a, b, c) {
return a + ' ' + b + ' ' + c;
}
function trackArguments(fn, ctx) {
const trackedArgs = [];
function tracker(partialFn, ...args) {
trackedArgs.push(...args);
const res = fn.call(ctx, partialFn, ...args);
res.trackedArgs = trackedArgs;
return res;
}
tracker.trackedArgs = trackedArgs;
return tracker
}
const trackedPartial = trackArguments(_.partial, _);
var sayHelloTo = trackedPartial(greet, 'hello', 'Stack');
console.log('Arguments passed already:', sayHelloTo.trackedArgs);
console.log('Execution works perfctly:', sayHelloTo('Overflow'))
(HOF)的概念,对于这种情况证明非常强大。
HOF是一个包装另一个函数的函数,同时它为传递的函数添加了“额外的手”。
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>
for