Мы проверим, что на самом деле происходит, когда вы объявляете var
и let
один за другим.
Case1 : с использованием var
<script>
var funcs = [];
for (var i = 0; i < 3; i++) {
funcs[i] = function () {
debugger;
console.log("My value: " + i);
};
}
console.log(funcs);
</script>
Теперь откройте окно консоли хрома , нажав F12 и обновите страницу.
Расходуйте каждые 3 функции внутри массива. Вы увидите свойство с именем [[Scopes]]
. Расширьте это свойство. Вы увидите один
объект массива с именем "Global"
, разверните его. В объекте объявлено свойство 'i'
, которое имеет значение 3.
Вывод:
- Когда вы объявляете переменную, используя
'var'
вне функции, она становится глобальной переменной (вы можете проверить, набрав i
или
window.i
в окне консоли. Будет возвращено 3).
- Анонимная функция, которую вы объявили, не будет вызывать и проверять значение внутри функции, пока вы не вызовете
функции.
- Когда вы вызываете функцию,
console.log("My value: " + i)
получает значение из объекта Global
и отображает
результат.
CASE2: используя let
Теперь замените 'var'
на 'let'
<script>
var funcs = [];
for (let i = 0; i < 3; i++) {
funcs[i] = function () {
debugger;
console.log("My value: " + i);
};
}
console.log(funcs);
</script>
Сделай то же самое, иди в прицел. Теперь вы увидите два объекта "Block"
и "Global"
. Теперь разверните Block
объект, вы
увидим, что здесь определено «i», и странно то, что для каждой функции значение, если i
, отличается (0, 1, 2).
Вывод:
Когда вы объявляете переменную, используя 'let'
даже вне функции, но внутри цикла, эта переменная не будет глобальной
переменная, она станет переменной уровня Block
, которая доступна только для той же функции. По этой причине мы
когда мы вызываем функции, значение i
отличается для каждой функции.
Для получения более подробной информации о том, как работает ближе, ознакомьтесь с потрясающим видеоуроком https://youtu.be/71AtaJpJHw0