官术网_书友最值得收藏!

  • JavaScript:Moving to ES2015
  • Ved Antani Simon Timms Narayan Prusty
  • 231字
  • 2021-07-09 19:07:33

Loops and closures

Consider the following example of using functions inside loops:

for (var i=1; i<=5; i++) {
  setTimeout( function delay(){
    console.log( i );
  }, i*100);
}

This snippet should print 1, 2, 3, 4, and 5 on the console at an interval of 100 ms, right? Instead, it prints 6, 6, 6, 6, and 6 at an interval of 100 ms. Why is this happening? Here, we encounter a common issue with closures and looping. The i variable is being updated after the function is bound. This means that every bound function handler will always print the last value stored in i. In fact, the timeout function callbacks are running after the completion of the loop. This is such a common problem that JSLint will warn you if you try to use functions this way inside a loop.

How can we fix this behavior? We can introduce a function scope and local copy of the i variable in that scope. The following snippet shows you how we can do this:

for (var i=1; i<=5; i++) {
  (function(j){
    setTimeout( function delay(){
      console.log( j );
    }, j*100);
  })( i );
}

We pass the i variable and copy it to the j variable local to the IIFE. The introduction of an IIFE inside each iteration creates a new scope for each iteration and hence updates the local copy with the correct value.

主站蜘蛛池模板: 工布江达县| 隆子县| 奉节县| 黄骅市| 如皋市| 延津县| 永川市| 大足县| 道孚县| 务川| 平潭县| 盈江县| 威远县| 乐昌市| 富锦市| 高碑店市| 台州市| 繁峙县| 丹凤县| 中江县| 怀仁县| 米易县| 察哈| 合川市| 吉木萨尔县| 那曲县| 仙居县| 潮安县| 沭阳县| 纳雍县| 苏尼特左旗| 冕宁县| 托克托县| 永州市| 浮山县| 怀柔区| 乌兰浩特市| 临湘市| 天等县| 施甸县| 堆龙德庆县|