如何从setTimeout调用匿名函数

时间:2018-03-05 19:30:47

标签: javascript

我有一个循环,一个setTimout和一个回调。我需要使用匿名函数来保持回调中的变量正确。

我希望将回调作为一个单独的函数,因为它太大而无法在循环中使用。

这不起作用:

for (var i = 0; i < 10; i++) {
  setTimeout(callback, 1000*i, i);
}

var callback;
(callback = function(i) {
  console.log(i);
})();

如何定义我可以从setTimeout调用的匿名函数?

5 个答案:

答案 0 :(得分:1)

看来你不需要比这更复杂的东西:

function callback(i) {
  console.log(i);
};

for (var i = 0; i < 10; i++) {
  setTimeout(callback, 1000*i, i);
}

你有两个问题:

  • 您在定义之前尝试使用callback
  • 你将你的函数包装在IIFE中(没有明显的原因),这意味着它会被undefined参数调用一次。

答案 1 :(得分:1)

如果我理解正确,在我看来,将setInterval()setTimeout()结合使用for循环更合乎逻辑。

我使用闭包创建了一个回调函数来跟踪我的示例中的计数器变量:

function init() {
  var increment = initCounter();

  setInterval(function() {
    console.log(increment());
  }, 1000);
}


function initCounter() {
  var i = 0;
  return function() {
    return ++i;
  }
}

init();

答案 2 :(得分:1)

只需在函数表达式之后放置for循环。

这是按照你的方法进行的。

&#13;
&#13;
var callback;
(callback = function(i) {
  if (i !== undefined)
    console.log(i);
})();

for (var i = 0; i < 10; i++) {
  setTimeout(callback, 1000, i);
}
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

使用函数声明的更好方法:

&#13;
&#13;
function callback(i) {
    console.log(i);
};

for (var i = 0; i < 10; i++) {
  setTimeout(callback, 1000, i);
}
&#13;
.as-console-wrapper { max-height: 100% !important; top: 0; }
&#13;
&#13;
&#13;

答案 3 :(得分:1)

使用ES6 Arrow Functions

&#13;
&#13;
let callback = (i) => {
  console.log(i);
}

for (var i = 0; i < 10; i++) {
  setTimeout(callback, 1000, i);
}
&#13;
&#13;
&#13;

答案 4 :(得分:0)

我遗漏了一些东西,你问的是如何调用匿名函数,但每个答案(包括你自己的问题)都包含了命名函数。

出了什么问题:

bundle update rails