31.01.2021, 21:28
|
Аспирант
|
|
Регистрация: 01.12.2020
Сообщений: 55
|
|
НЕ срабатывает цикл for
Почему код срабатывает только тогда когда
поменять на
?
Если оставить код как есть вывод:
Сам код:
Код:
|
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<script>
const fib = [1,2,3,5,8,13]
for(var i = 0; i < fib.length; i++){
setTimeout(function() {
console.log(`fib[${i}] = ${fib[i]}`)
},1500)
}
</script>
</body>
</html> |
Вот такой код:
Код:
|
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<script>
const fib = [1,2,3,5,8,13]
for(var i = 0; i < fib.length; i++){
(function(j){
setTimeout(function() {
console.log(`fib[${i}] = ${fib[i]}`)
},1500)
})(i)
}
</script>
</body>
</html> |
выдаст также
Последний раз редактировалось denis_alekss, 31.01.2021 в 21:56.
|
|
31.01.2021, 21:38
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,121
|
|
|
|
31.01.2021, 21:43
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,750
|
|
Переменные, объявленные var попадают в глобальный объект или имеют область видимости функции.
Т.е в вашем случае (когда var) будет всего одна глобальная переменная (содержащаяся в глобальном объекте window)
Переменные объявленные let имеют глобальную область видимости (это не тоже самое, что глобальный объект) или область видимости блока. Блок это все, что в {} тело функции или цикл - частный случай блока. Обнако у циклов блок начинается не с {, а с оператора for (или while)
Фактически на каждой итерации цикла for заводится своя переменная i.
Далее, когда вы создаете функцию
function() {
console.log(`fib[${i}] = ${fib[i]}`)
}
Она использует замыкание на переменную i, созданную именно на этой итерации.
|
|
31.01.2021, 21:49
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,121
|
|
denis_alekss,
let создаёт замыкание типа такого ...
const fib = [1, 2, 3, 5, 8, 13];
for (var i = 0; i < fib.length; i++) {
setTimeout((
function(i) {
return function() {
console.log(`fib[${i}] = ${fib[i]}`)
}
}
)(i), 1500 * i)
}
|
|
31.01.2021, 21:58
|
|
Профессор
|
|
Регистрация: 03.02.2020
Сообщений: 2,750
|
|
Сообщение от denis_alekss
|
Вот такой код:
Код:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<script>
const fib = [1,2,3,5,8,13]
for(var i = 0; i < fib.length; i++){
(function(j){
setTimeout(function() {
console.log(`fib[${i}] = ${fib[i]}`)
},1500)
})(i)
}
</script>
</body>
</html>
выдаст также
Код:
fib[6] = undefined
|
А надо
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<script>
const fib = [1,2,3,5,8,13]
for(var i = 0; i < fib.length; i++){
(function(j){
setTimeout(function() {
console.log(`fib[${j}] = ${fib[j]}`)
},1500)
})(i)
}
</script>
</body>
</html>
|
|
31.01.2021, 22:09
|
Аспирант
|
|
Регистрация: 01.12.2020
Сообщений: 55
|
|
Цитата:
|
let создаёт замыкание типа такого ...
|
А var не создает замыкания, из-за этого вывод через полтора секунды
fib[6] = undefined
?
|
|
31.01.2021, 22:20
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,121
|
|
denis_alekss,
i на момент срабатывая любого setTimeout имеет значение 6 -- элемента с таким индексом не существует.
|
|
31.01.2021, 22:32
|
Аспирант
|
|
Регистрация: 01.12.2020
Сообщений: 55
|
|
Если код оставить как есть
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<script>
const fib = [1,2,3,5,8,13]
for(var i = 0; i < fib.length; i++){
setTimeout(function() {
console.log(`fib[${i}] = ${fib[i]}`)
},1500)
}
</script>
</body>
</html>
и поменять просто на let не используя замыкания, код выведет правильно из-за того что let само по себе в движке создает замыкание?
|
|
31.01.2021, 22:36
|
|
Профессор
|
|
Регистрация: 27.05.2010
Сообщений: 33,121
|
|
Сообщение от denis_alekss
|
let само по себе в движке создает замыкание?
|
да
|
|
31.01.2021, 22:42
|
Аспирант
|
|
Регистрация: 01.12.2020
Сообщений: 55
|
|
По какой причине var не создает замыкания и не сохраняет i за каждой итерацией?
Вот здесь будет 3 раза подряд 5 выводится, хотя я вывожу разные индексы
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<script>
let result = []
for (var i = 0; i < 5; i++){
result.push(function(){
console.log(i)
})
}
result[2]()
result[4]()
result[1]()
</script>
</body>
</html>
Последний раз редактировалось denis_alekss, 31.01.2021 в 23:10.
|
|
|
|