- 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.
- R語(yǔ)言數(shù)據(jù)分析從入門(mén)到精通
- 國(guó)際大學(xué)生程序設(shè)計(jì)競(jìng)賽中山大學(xué)內(nèi)部選拔真題解(二)
- Flask Blueprints
- TypeScript Blueprints
- Kubernetes實(shí)戰(zhàn)
- Learn Type:Driven Development
- Visual Basic編程:從基礎(chǔ)到實(shí)踐(第2版)
- INSTANT FreeMarker Starter
- HDInsight Essentials(Second Edition)
- Android驅(qū)動(dòng)開(kāi)發(fā)權(quán)威指南
- JavaScript動(dòng)態(tài)網(wǎng)頁(yè)編程
- Apache Camel Developer's Cookbook
- Python Projects for Kids
- Python預(yù)測(cè)分析實(shí)戰(zhàn)
- Python Social Media Analytics