Javascript如何处理将setInterval()赋值给变量?

4

我有一个看起来很基础的JavaScript问题,但我无法理解。为什么下面的代码片段可以运行(从w3学校摘录)?

本质上我想问的是为什么下面的"myVar"变量会在没有显式调用的情况下执行setInterval方法?我最好的猜测是这与JavaScript处理变量赋值的方式有关?

<html>
<body>

<p>Click the button to wait 3 seconds, then alert "Hello".</p>
<p>After clicking away the alert box, an new alert box will appear in 3 seconds. This goes on forever...</p>

<button onclick="myFunction()">Try it</button>

<script>
var myVar;

function myFunction() {
    myVar = setInterval(alertFunc, 3000);
}

function alertFunc() {
  alert("Hello!");
}
</script>

</body>
</html>

如果需要进一步澄清,这里是我目前工作中的代码片段:
var refresh = setInterval(function() {
      $("#div").load('Query.html');
   }, 1000);

所以我的问题是,为什么上述代码可以正常工作而不需要在其他地方调用“refresh”变量?

你想调用变量吗?怎么做?变量是在隐藏什么吗?!变量有自己的方法吗? - Oen44
5个回答

6

setInterval()方法自身执行周期性调用并返回处理循环调用的进程ID。分配返回值的目的是为了在之后使用clearInterval(),因为它要求您将setInterval()(即进程ID)的返回值作为其参数传递。

在您的情况下,如果您希望通过使用setInterval创建的“循环调用链”不再调用setInterval()中传递的函数,可以简单地执行clearInterval(refresh)

编辑

setInterval需要两个参数:内联函数(或函数指针)和整数。

setInterval的作用是等待传递的整数毫秒数,然后调用该函数,并重复相同的操作,直到您调用clearInterval并传递setInterval的返回值。


1
谢谢您的回复!我有点困惑,不知道这是setinterval()本身的特性还是与JavaScript赋值有关。现在更清楚了。再次感谢! - pmcy85

3

setInterval会安排一个函数表达式/引用的重复执行,并返回此计划的唯一标识符。传递的函数将每隔X毫秒(间隔是传递给setInterval的第二个参数)调用一次。您不需要将其返回值分配给变量以便使用setInterval。存储此标识符的主要原因是以后可以通过调用clearInterval(yourIntervalIdHere)取消此计划。


1

1

myVar = setInterval(alertFunc, 3000);

我的变量myVar将存储setInterval函数的输出,每隔3秒调用alertFunc函数。

这并不是将函数变量存储到myVar中,而是将“setInterval”函数的输出存储到myvar中。

举个简单的例子,在下面的代码中,你正在将testfunc()的返回值赋给test。

var test;
function foo(){
  test = testfunc();
}
function testfunc(){
  console.log("hi");
}
foo();

如果你想将testfunc函数分配给test,你需要这样写:

var test;
function foo(){
  test = testfunc;
}
function testfunc(){
  console.log("hi");
}
foo();

然后您需要显式地调用。

好的,这很有道理。只是为了澄清,在你上面的第一个代码片段中,当调用foo()时,testfunc()会立即运行并将输出存储到"test"中,而在第二个代码片段中,"testfunc"函数直到你显式调用test()才会被调用。 - pmcy85
在 JavaScript 中,函数是对象,因此您可以调用函数并获取输出并存储(第一个片段),或者直接将函数存储在变量中(第二个片段)。 - Bhabani Das

-1
它不会“在没有显式调用的情况下执行setInterval方法”。显式调用在这里:myVar = setInterval(alertFunc, 3000); 在函数myFunction内部。 myvar 包含调用setInterval的返回值。

哇,一个正确答案的踩。多可爱啊。注意:“我实际上想问的是为什么下面的“myVar”变量会在没有显式调用的情况下执行setInterval方法?” - gforce301
你们孩子们又闹矛盾了吗?互相给对方的答案点踩? - Christoph
1
另外,从技术上讲,你的答案是不正确的。它并没有立即执行函数(至少你的回答是这样暗示的),因为它只是传递了一个函数引用,该引用稍后才会被执行。 - Christoph
请问? setInterval() 这是一个函数调用。注意到括号了吗?这是我们可以知道它是一个函数调用的方式。从这个页面的第一行开始:https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/setInterval "The setInterval() method". - gforce301
哇,我们又遇到了无法阅读和理解的问题。这是最后一次了。"我想问的基本上是为什么下面的"myVar"变量会执行setInterval方法而不需要显式调用?"你看到我回答的"执行setInterval方法"这部分了吗?就这样。 - gforce301
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接