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

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.

主站蜘蛛池模板: 许昌市| 麦盖提县| 太康县| 灵台县| 库尔勒市| 新邵县| 缙云县| 泸西县| 万宁市| 阿荣旗| 五峰| 儋州市| 武义县| 永宁县| 台前县| 都江堰市| 同江市| 丰都县| 温泉县| 浦县| 白银市| 平度市| 肥西县| 沛县| 蕲春县| 石阡县| 板桥市| 黔东| 科技| 平谷区| 张掖市| 若尔盖县| 南雄市| 英德市| 祁东县| 乌拉特中旗| 甘洛县| 瑞金市| 金门县| 海盐县| 江城|