2016-01-06 369 views
0

我试图用setInterval重复调用一个函数。当我调用没有参数的函数时,它可以工作。但是,使用参数调用函数时,该函数仅被调用一次。setInterval不调用带参数的函数

Here是JS拨弄

HTML

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Title</title> 
</head> 
<body> 

<script src="./check.js"> 

</script> 
</body> 
</html> 

check.js没有参数 - 工程

setInterval(myfun,100) 
var mycounter = 0; 

function myfun() 
{ 
    console.log(mycounter++) 
} 

check.js带参数的 - 不工作

setInterval(myfun(0),1000) 

function myfun(mycounter) 
{ 
    console.log(mycounter++) 
} 

回答

3

Wh您添加圆括号该函数立即被调用,并且返回的结果在间隔中使用,在您的情况下是默认返回值undefined

你真正做的是

var result = myfun(0); // returns undefined 

setInterval(result, 1000); // no go, result is undefined 

function myfun(mycounter) { 

} 

,如果你想传递参数,最简单的是只使用匿名函数

setInterval(function() { 
    myfun(0); 
}, 1000); 

现代浏览器(不IE9及以下)现在支持直接传递参数setInterval

setInterval(myfun, 1000, 0); // "0" is passed as the first argument to myfun() 

当然,我ncrementing变量只能做,如果在回调函数之外的范围为间隔

+0

这是我的代码了。它只是打印零。 的setInterval(函数(){ myfun(0) },1000) 函数myfun(mycounter) { 的console.log(mycounter ++) } 我怎么能增加内部myfun mycounter,并仍然得到越来越计数显示。 – PepperBoy

+0

@PepperBoy - 每次调用时间间隔中的函数,并且每次调用'0'时,都不能这样增量,变量没有保持状态,每次都是一个新变量。如果你想iincrement变量必须被存储在'myfun'函数之外的某个地方,通常情况下,你的第一个例子就是这样做的。 – adeneo

1

权存在变数......

什么的setInterval希望是一个函数,它可以调用,

第一种情况您提供的功能

在第二种情况下,你调用的函数,然后返回其值

完成你正在尝试以你这样做第二种情况下要做到:

setInterval(function() {myFun(20)}, 1000} 

它创建一个新功能,包裹你的呼叫myFun里面......理解?

现在其他的事情要记住的是,setInterval的保持调用该函数永远,直到你停止它....所以你可以这样做:

var counter = 20; 
setInterval(function() {counter = counter-1; if (counter > 0) myFun()}, 1000) 

它将调用myFun每一秒,直到计数器到期...

但这还不够完善一个区间将继续运行下去,你要那么什么是这样的(它的工作示例,请单击底部的运行按钮)

function nTimes(fn, count, time) { 
 
     var interval = setInterval(function() { 
 
     if (count > 0) { 
 
      count = count - 1; 
 
      fn(count); 
 
     } else { 
 
      clearInterval(interval); 
 
     } 
 
     }, time) 
 
    }; 
 

 

 
    function myFun(x) { 
 
     $('#output').html($('#output').html() + x + '</br>') 
 
    } 
 
    nTimes(myFun, 20, 1000)
<div id='output'></div> 
 

 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

+0

此代码将始终输出20 ... – Ahsan

+0

@Mitch VanDuyn,谢谢我了解原因。但是,这是我现在的代码。它总是输出0的setInterval(函数(){myfun(0)},1000) 函数myfun(mycounter) { 的console.log(mycounter ++) } 正如我说,我要myfun有一个参数,并显示增加的计数。 – PepperBoy

+0

当然,只要在上面的示例中传递给fn即可。 –

0

工作小提琴https://jsfiddle.net/0tesf2rk/

var counter = { 

    value: 0, 

    increase: function() { 

    console.log(counter.value); 

    counter.value++; 

    } 

}; 

counter.value = 20; 

setInterval(counter.increase, 1000); 
+0

谢谢。但正如我所说的,我希望能够将初始值(如20)作为参数传递给由setInterval调用的函数,并且随后的增量将发生在辅助函数内部,如myfun。 – PepperBoy