如何确定已经传递给lodash部分函数的参数?

时间:2017-08-24 12:18:49

标签: javascript lodash

假设我将不同的数据传递到不同位置的函数中,以解决某些遗留决策/代码。

var partialFunction;
if(thisSituationIsCrazy(data, value)) {
    partialFunction = _.partial(originalFunciton, data)
} else {
    partialFunction = _.partialRight(originalFunction, value)
}

有没有办法确定实际传入的值和函数中的哪个位置?这仅用于调试目的。

我希望有类似partialFunction.arguments之类的内容或某些内容,以便了解它所处的位置,因为实际情况比我的例子更复杂。

我根本没有找到基于lodash docssource code的方法。我也没有在任何有关此主题的博客中看到这一点。

2 个答案:

答案 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;
&#13;
&#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