我想用setInterval只调用一次myfun1。我想避免使用全局变量。阅读this但它不起作用(只需每2000毫秒调用一次该函数)。当然,我需要每2000毫秒调用main()。
(function($){
setinterval(main,2000);
function main (){
if(/*condition*/) return;
function callItOnce(fn) {
var called = false;
return function() {
if (!called) {
called = true;
return fn();
}
return;
}
}
myfun1 = callITOnce(myfun1);
myfun1();
function myfun1(){/*code*/};
function myfun2(){/*code*/};
function myfun3(){/*code*/};
})(jquery);
答案 0 :(得分:5)
使用标志:
(function($){
var timer = setInterval(main,2000), ran=true;
function main() {
if(/*condition*/) return;
if (ran) { //runs when ran=true, which is only the first time
myfun1();
ran = false; //since it's set to false here
}
function myfun1(){/*code*/};
function myfun2(){/*code*/};
function myfun3(){/*code*/};
})(jquery);
答案 1 :(得分:0)
您编写的callItOnce
函数应该有效。您只需要在setInterval
调用之外声明该函数。否则每次都会重新定义。
(function () {
function myfun1(){/*code*/};
function myfun2(){/*code*/};
function myfun3(){/*code*/};
function callItOnce(fn) {
var called = false;
return function() {
if (!called) {
called = true;
return fn();
}
return;
}
}
myfun1 = callItOnce(myfun1);
function main() {
if(/*condition*/) return;
myfun1();
}
setInterval(main, 2000);
}());
答案 2 :(得分:0)
解决此问题的一种简单方法是在函数本身上使用变量。
function myFunc1(){
if(arguments.callee.done){return;}
arguments.callee.done = true;
}
这样,方法myFunc1上的“done”变量将确保该方法只执行一次。
答案 3 :(得分:-1)
setInterval返回一个值,您可以将该值传递给clearInterval以停止调用回调。
var i = 0;
var timeout_id = setTimeout(function(){
console.log(i);
if(i >= 5){ clearTimeout(timeout_id) }
i++;
})