如何查看使用javascript/jquery调用函数的次数?

Web*_*urk 14 javascript jquery

也许这是一个奇怪的问题,但在这里:我有一个我定期调用的函数,在该函数中我需要知道我所处的迭代次数,或函数被调用了多少次.问题的简化版本:

jQuery( document ).ready( function(){
    setInterval( "myFunction()", 3000 );
});

function myFunction()
{
    alert( "I have been called X times" );
}
Run Code Online (Sandbox Code Playgroud)

那么,我如何在上面的代码中找出X?

Vil*_*lx- 25

简易版:在nyarlathotep的答案中创建一个全局变量.问题 - 如果其他一些代码也定义了一个具有相同名称的全局变量,那么你们都遇到了麻烦.

简易扩展版 - 给变量一个没人会用的疯狂名字: calledTimesED7E69A7B141457CA8908A612E3D7A3A

聪明的版本:将该变量附加到现有的全局变量.记住 - 一切都是 Javascript中一个对象!

$(function(){ setInterval(myFunction, 3000); });

function myFunction()
{
    myFunction.calledTimes++;
    alert( "I have been called " + myFunction.calledTimes + " times" );
}
myFunction.calledTimes = 0;
Run Code Online (Sandbox Code Playgroud)

传统版本:使用作用域来隐藏该变量.

$(function()
{
    calledTimes = 0;
    setInterval(function()
    {
        calledTimes++;
        alert( "I have been called " + calledTimes + " times" );
    }, 3000); 
});
Run Code Online (Sandbox Code Playgroud)

这隐藏了"myFunction",所以让我们再次尝试使用一种棘手的范围:

var myFunction = null;
(function()
{
    calledTimes = 0;
    myFunction = function()
    {
        calledTimes++;
        alert( "I have been called " + calledTimes + " times" );
    } 
})();

$(function () { setInterval(myFunction, 3000); });
Run Code Online (Sandbox Code Playgroud)

...还有很多其他的方法可以隐藏变量和范围.只需选择你喜欢的.

  • 呐,我只是不愿意重新开始工作!XD (3认同)
  • 令人惊讶的是,人们在这里回答问题需要花费多少时间和精力.如果我可以将这个答案投票一千次,我会:)感谢广泛但简单解释的答案! (2认同)

cod*_*ing 17

您可以简单地使用一个全局变量,每次调用该函数时都会增加该变量:

var myFuncCalls = 0;

function myFunction()
{
    myFuncCalls++;
    alert( "I have been called " + myFuncCalls + " times" );
}
Run Code Online (Sandbox Code Playgroud)

一旦您的代码变得更复杂(或者如果您使用了许多其他库),您应该考虑使用范围,如此处的其他答案所示(最好在Vilx中解释).

  • @FoadFarkhondeh 对于这样的解决方案,您应该非常小心,因为全局命名空间污染通常是一种不好的做法。 (2认同)

mač*_*ček 9

这是另一个不使用外部变量的有趣解决方案.关于这一点最好的部分是你可以保持任何预先存在的功能不受影响,并像平常一样调用它们.这意味着如果您尝试"点击"现有库中的某个功能,这将非常适合您.它增加了一个不显眼的计数器,允许您继续正常调用现有函数; 即使有争论!

// no js library required

// pre-existing function
var a = function(){
    console.log("pre-existing function function");
    console.log("arguments:", arguments);
};

// add counter func
var addFnCounter = function(target){
    var swap = target;
    var count = 0;
    return function(){
        swap.apply(null, arguments);
        count++;
        console.log("func has been called " + count + " times");
        console.log("\n");
    };
};

// usage
a = addFnCounter(a);

// call a() as you would normally
a();
a(1,2,3);
a('hello', 'world');

// using your setInterval example
setInterval(a, 3000);
Run Code Online (Sandbox Code Playgroud)

产量

pre-existing function function
arguments: []
func has been called 1 times

pre-existing function function
arguments: [1, 2, 3]
func has been called 2 times

pre-existing function function
arguments: ["hello", "world"]
func has been called 3 times
Run Code Online (Sandbox Code Playgroud)

setInterval 产量

pre-existing function function
arguments: []
func has been called 4 times

pre-existing function function
arguments: []
func has been called 5 times

pre-existing function function
arguments: []
func has been called 6 times
Run Code Online (Sandbox Code Playgroud)

看到它在jsfiddle上工作

  • 对于任何想知道的人来说,一个函数接受另一个函数并返回一个修改后的版本,称为 **Decorator**。 (2认同)

Ben*_*est 8

你必须使用一个闭包.通常你会使用一个静态变量.在Javascript中,它看起来像:

jQuery( document ).ready( function(){
    setInterval( myFunction, 3000 );
});

var myFunction = (function(){
    var count = 0;
    return function(){
         count++
         alert( "I have been called " + count + " times");
    }
})();
Run Code Online (Sandbox Code Playgroud)

演示:http://jsfiddle.net/MZQ83/2/

  • 这应该是公认的答案. (2认同)