【问题标题】:How does Javascript handle assigning setInterval() to a variable?Javascript 如何处理将 setInterval() 分配给变量?
【发布时间】:2017-09-15 23:58:26
【问题描述】:

我有一个基本的 javascript 问题,我无法理解。为什么下面的代码 sn-p 工作(取自 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>

如果需要进一步说明,这里是我当前工作中的代码 sn-p:

var refresh = setInterval(function() {
      $("#div").load('Query.html');
   }, 1000);

所以我的问题是,为什么上面的工作没有在其他地方调用“刷新”变量?

【问题讨论】:

  • 你想调用变量吗?如何?变量是否对我们隐藏了什么?!变量有自己的方法吗?

标签: javascript jquery


【解决方案1】:

setInterval() 自己执行循环调用(参见编辑)并返回处理循环调用的进程的 ID。分配返回值的目的是在之后使用clearInterval(),因为它要求您将setInterval()(=进程ID)的返回值作为其参数传递。

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

编辑

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

setInterval 所做的是等待 {integer passed} 毫秒,然后调用该函数并一遍又一遍地重做相同的事情,直到您调用 clearInterval 并传递 setInterval 的返回值。

【讨论】:

  • 感谢您的回复!如果这是 setinterval() 本身的特征还是与 javascript 分配有关,我只是有点困惑。现在更有意义了。再次感谢!
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    setInterval 将立即启动计时器以运行该函数。该函数只是返回一个 ID 来跟踪计时器,以便稍后取消它。请参阅下面的文档。

    https://developer.mozilla.org/en-US/Add-ons/SDK/High-Level_APIs/timers#setInterval(callback_ms)

    【讨论】:

      【解决方案4】:

      myVar = setInterval(alertFunc, 3000);

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

      对于更简单的示例,在下面的代码中,您将 testfunc() 的返回分配给测试。

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

      如果你想分配 testfunc 函数来测试你必须像这样写

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

      那么你需要显式调用

      【讨论】:

      • 好吧,这是有道理的。澄清一下,在上面的第一个代码 sn-p 中,testfunc() 将在调用 foo() 时立即运行并将该输出存储到“test”中,而在第二个代码 sn-p 中,“testfunc”函数不会在您明确调用 test() 之前被调用?
      • 完全正确。在 java 脚本中,函数是对象,因此您可以调用函数并获取输出并存储(第一个 sn-p),或者您可以直接将函数存储在变量中(第二个 sn-p)
      【解决方案5】:

      它不会“在没有显式调用的情况下执行 setInterval 方法”。显式调用就在这里:myVar = setInterval(alertFunc, 3000); 在函数 myFunction 内。

      myvar 包含调用setInterval 的返回值。

      【讨论】:

      • 对正确答案投了反对票。多可爱。请注意“基本上我要问的是为什么下面的“myVar”变量在没有显式调用的情况下执行 setInterval 方法?”
      • 你们这些孩子是不是又在为对方的答案投反对票而吵架?
      • 另外,从技术上讲,您的答案不正确。它确实 not 立即执行该函数(至少这是您的回答所暗示的),因为它只是移交了一个稍后执行的函数 reference
      • 请问?这个setInterval() 是一个函数调用。注意到括号了吗?这就是我们如何判断它是一个函数调用的方式。从本页的第一行开始:developer.mozilla.org/en-US/docs/Web/API/…“setInterval() 方法”。
      • 是的,但是您作为参数传递的函数不会立即执行!它只是简单地添加到事件循环并稍后执行(这也是为什么 OP 感到困惑)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-09
      • 1970-01-01
      • 2014-03-04
      • 2014-05-19
      • 2023-03-26
      • 1970-01-01
      • 2020-10-15
      相关资源
      最近更新 更多