【问题标题】:Why does this function only run once?为什么这个函数只运行一次?
【发布时间】:2016-09-24 11:43:01
【问题描述】:

我真的认为这应该每 100 毫秒运行一次,但它只会发出一次哔哔声。

我知道 setInterval,但这让我很困惑。

var test = function () {
    console.log('beep')
    setTimeout( test, 100 );
}();

有人知道为什么这只运行一次而不是永远运行吗?

【问题讨论】:

  • 提示:var test = function() { console.log('beep'); setTimeout( test, 100); return "I am not a function"; }(); console.log(test);
  • @torazaburo 也许你也应该这样做
  • "相同" = 在控制台中运行它。不幸的是,对setTimeout(undefined, 100) 的调用不会产生错误。

标签: javascript settimeout


【解决方案1】:

匿名函数在分配给test之前正在执行。

您可以将其声明为命名函数表达式:

(function test() {
  console.log('beep')
  setTimeout(test, 100);
})();

或者推迟调用函数直到赋值之后:

var test = function() {
  console.log('beep')
  setTimeout(test, 100);
};
test();

【讨论】:

  • 它不是匿名的,我在里面放了一个var 并给了它一个名字和所有东西,那么提升呢? (头爆炸)谢谢!现在,如果我们能找出这个答案的谷歌查询问题......
  • @DigitalDesignDj 您的代码声明了一个名为“test”的变量,然后将立即调用的函数表达式的返回值分配给它。 IIFE 不需要括号,因为编译器已经知道它是一个表达式,而不是一个声明。 (顺便说一句,返回值是未定义的,但是蜜獾^H编译器不在乎)
  • @DigitalDesignDj 它是匿名的,因为它在赋值操作之前没有名称来引用它。您可能有兴趣阅读Function#name
【解决方案2】:

OP 使变量test 成为函数的返回值,而不是函数本身。

你可以这样做:

var test = function(){
    setTimeout(test,100);
};
test();

或者

(function test() {
  setTimeout(test, 100);
})();

【讨论】:

  • test 不是函数(也不是),test() 显然会失败,不是吗?
  • 我是说在OP的代码中,他将test设为匿名函数的返回值。
  • 也许您应该编辑以显示您建议更改的确切内容。我想我明白了,但不是很清楚。
  • 我觉得这个答案基本是对的。测试没有被设置为任何东西。这就是代码不循环的原因。
  • 很抱歉。在电话里回答。现在对其进行编辑以使其更清晰。
【解决方案3】:

以下链接包含答案,即创建阶段之后是执行阶段。测试变量在执行阶段未定义......当函数执行时。 https://m.youtube.com/watch?v=Bv_5Zv5c-Ts

【讨论】:

  • 虽然理论上这可以回答这个问题,it would be preferable 在这里包含答案的基本部分,并提供链接以供参考。
  • 基本部分是执行阶段,其中测试在创建阶段由 JavaScript 运行时引擎设置为未定义。我还添加了参考链接
【解决方案4】:

这样试试

var test = function () {
console.log('beep');
}
setInterval(test, 300);

【讨论】:

  • OP 知道 setInterval。这并没有回答他们的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-17
  • 1970-01-01
  • 2020-07-31
  • 1970-01-01
相关资源
最近更新 更多