for (var i = 0; i < 10; i++) {
setTimeout(function() { console.log(i) }, 10);
}
// alerts 10, 10 times
for (var i = 0; i < 10; i++) {
(function(i) {
// explicitly scope i
setTimout(function() { console.log(i) }, 10);
})(i);
}
При создании функций внутри других функций и доступе к переменным вверх по цепочке областей действия через область замыкания может быть полезно «явно ограничить область действия» переменной внутри внешней функции.
Хотя это анти паттерн. Правильное решение будет
var generateLogger = function(i) {
return function() { console.log(i); };
}
for (var i = 0; i < 10; i++) {
setTimeout(generateLogger(i), 10);
}
Поскольку генерация функций в цикле неэффективна и плохая практика.
Нет реальных случаев использования «явных областей видимости» переменных, которых нельзя избежать, не создавая функции внутри других функций.