如何确定哪些参数已传递给lodash局部函数?

问题描述:

假设我在不同的地方将不同的数据传递给一个函数来解决一些遗留的决策/代码。如何确定哪些参数已传递给lodash局部函数?

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

有没有一种方法可以确定实际传入的值以及函数中的哪个位置?这仅用于调试目的。

我希望得到类似partialFunction.arguments之类的东西,这样可以揭示它所处的位置,因为实际情况比我的例子更复杂。

我还没有看到基于lodash docssource code的方法。我也没有看到任何关于这个主题的博客中提到的这一点。

Higher order functions(HOF)的函数式编程概念,这证明对于这种情况非常强大。

HOF是一种包装另一个函数的函数,它将“额外的手”添加到传递的函数中。

//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'))
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>

+0

基本上它是一样的东西,但为此OP需要将源代码从'_.partial(fnName,someArgs)'更改为'trackedPartial(fnName,someArgs)'在现有项目的所有位置,不是这样? –

+0

@KoushikChatterjee同样的结果,为true。但是这更受欢迎,因为它带来了使用函数式编程范例,更好的可测试性,不重写,保持纯文本以及更具可读性的好处,因为你知道_.partial总是相同的,而不是每个应用程序都改变例如。 – Bamieh

显然这是在函数内部实现的,当你调用最后一个回调函数时,它会从更近的地方访问实际的函数,并且这个函数没有公开。

但是如果你想要的是真的,你可以继续换,对你的目的:

//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>

+0

这真的有光泽。这比我所希望的还要多得多,但我可以在这个问题上做到这一点。谢谢! – Pureferret

+1

为你调试的目的,你甚至可以从控制台执行它 –

+0

我实际上从一大堆业力/茉莉花测试运行,但我会给它一个去。 – Pureferret