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)
...还有很多其他的方法可以隐藏变量和范围.只需选择你喜欢的.
cod*_*ing 17
您可以简单地使用一个全局变量,每次调用该函数时都会增加该变量:
var myFuncCalls = 0;
function myFunction()
{
myFuncCalls++;
alert( "I have been called " + myFuncCalls + " times" );
}
Run Code Online (Sandbox Code Playgroud)
一旦您的代码变得更复杂(或者如果您使用了许多其他库),您应该考虑使用范围,如此处的其他答案所示(最好在Vilx中解释).
这是另一个不使用外部变量的有趣解决方案.关于这一点最好的部分是你可以保持任何预先存在的功能不受影响,并像平常一样调用它们.这意味着如果您尝试"点击"现有库中的某个功能,这将非常适合您.它增加了一个不显眼的计数器,允许您继续正常调用现有函数; 即使有争论!
// 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)
你必须使用一个闭包.通常你会使用一个静态变量.在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/