for循环关闭

时间:2018-08-13 16:32:19

标签: javascript

以下代码可完美运行,大括号后的(i)

for (var i = 0; i < 5; i++) {
  setTimeout(function(j) { 
    console.log(j);
  }(i), 1000);
}

这是在匿名函数中传递参数值的方法吗?

3 个答案:

答案 0 :(得分:1)

setTimeout的第一个参数是一个接受一个参数的函数表达式。 i为该参数提供值,(i)调用值为i的函数表达式。

原因是因为您不能直接在i的回调中使用setTimeout,因为setTimeout的异步特性和{{1}的同步特性会导致不必要的行为}循环。

使用函数表达式处理这种情况可确保将for的值绑定到i,从而正确产生所需的输出。

答案 1 :(得分:1)

  

这将创建立即执行的函数表达式(),JavaScript引擎将通过该表达式直接解释该函数。

答案 2 :(得分:1)

让我们来考虑这种情况:

  function fn(j) { // function declaration
    console.log(j);
  }

  fn(j); // function call

调用该函数。现在,函数也可以是表达式,它们可以求值到引用,并且可以通过在引用之后添加()来调用该函数,就像上面一样。这意味着

  function(j){ /*..*/ }(i)

实际上无需等待即可直接调用该函数。