【问题标题】:How do I return the number of times a function is invoked?如何返回调用函数的次数?
【发布时间】:2018-07-06 03:41:09
【问题描述】:

我试图在一个函数被调用 n 次后返回一个值。到目前为止,这是我所拥有的:

function spyOn(fn) { //takes in function as argument
//returns function that can be called and behaves like argument
var count = 0;

var inner = function(){
  count++;
}

inner.callCount = function(){return count};

}

这就是我测试它的方式:

for (var i = 0; i < 99; i++) {
  spyOn();
}

我觉得这是一个简单的问题,我应该可以简单地 google,但我一直无法找到解决方案。谢谢!

【问题讨论】:

  • 嗯,我看到的第一个问题是你从不调用原始函数。
  • 你想从spyOnreturn inner,然后在循环中使用that
  • @Bergi 仍然需要更多的东西才能工作,除非您假设 OP 知道将返回的变量存储并使用它而不是多次调用 spyOn...
  • @epascarello 是的,这就是我所说的“在循环中使用[返回的函数]”的意思。然后是“表现得像论点 fn”......

标签: javascript


【解决方案1】:

看起来您的 spyOn 函数应该接受函数 fn 作为参数并返回一个函数(我们称之为 inner),该函数调用 fn 并使用参数 inner 调用并返回值 fn 返回:

const spiedCube = spyOn( cube, function ( count, result ) {
  if ( count % 3 === 0 )
    console.log( `Called ${count} times. Result: ${result}` );
} );

for ( let i = 0; i < 12; i++ )
  console.log( spiedCube( i ) );

//

function spyOn( fn, handler ) {
    
    let count = 0;
  
    return function inner ( ) {
        count++;
        const result = fn( ...arguments );
        handler( count, result );
        return result;
    };
    
}

function cube ( x ) {
    return x**3;
}

【讨论】:

  • 这也是我正在准备的答案,但你的答案更好,因为你想到了一个处理程序。不知道为什么你把if (count % 3 === 0)放在你的例子中,可能更简单。
  • @RaphaMex 我只是想要一些常规输出来演示在“运行代码 sn-p”演示中工作的处理程序。 OP 不打算逐字使用它。
【解决方案2】:

你可以做一些你的函数的拦截器

这是一个小版本,从现在开始你可以添加参数和必要的行为,这里最重要的是你的函数是如何被拦截器包装的,每次调用都会增加调用次数。

function spyOn(fn) {
  var count = 0;
  
  return function() {
    fn();
    count++;

    console.log(count);
  }
}

var myFunction = function() {
  console.log("called!");
};

var spy = spyOn(myFunction);

for (var i = 0; i < 99; i++) {
  spy();
}

【讨论】:

    猜你喜欢
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多