Member 13814166 Ответов: 1

Как эта функция восстанавливает переменную "I"?


var funcs = [];
    
for (let i = 0; i < 10; i++) {
    funcs.push(function() { console.log(i); });
}
    
funcs.forEach(function(func) {
    func();   //How does this function retreive the variable "i"?
});


Как функция func(); восстанавливает переменную "i"?

Что я уже пробовал:

Когда выполняется функция func (), возвращается ли код в строку 4, где была создана функция?
Или func() заменяется на "console.log(a number)"?
Или func() буквально заменен на "console.log(i)"?

Thomas Daniels

- Привет! Вчера вы написали еще один комментарий к моему ответу, прося разъяснений, и тогда у меня не было времени ответить на него, но теперь вы, похоже, удалили этот комментарий.

Если вам все еще нужен ответ на ваш вопрос в комментарии, то это будет так:

На самом деле это никак не связано с областью применения. Целое число-это тип значения, поэтому, когда вы пишете "var b = t;", значение "t" копируется в "b", и с этого момента переменные независимы. Но опять же, это не связано с масштабом.

1 Ответов

Рейтинг:
0

Thomas Daniels

Цитата:
Как функция func(); восстанавливает переменную "i"?

С помощью оператора "return", который возвращает вызывающему объекту значение:
var funcs = [];
    
for (let i = 0; i < 10; i++) {
    funcs.push(function() { return i; });
}
    
funcs.forEach(function(func) {
    var i = func(); // note: you do not have to call it "i", you can give this variable any valid name
    console.log(i);
});

Цитата:
Когда выполняется функция func (), возвращается ли код в строку 4, где была создана функция?
Или func() буквально заменен на "console.log(a number)"?

На самом деле вы не "возвращаетесь" к строке 4: Когда вы звоните funcs.push(...), вы создаете новую функцию, которая возвращает значение, и это значение является тем, что i это. Поэтому, как только вы вышли из своего for циклы, Ваш массив содержит 10 определений функций: функция, которая возвращает 0, функция, которая возвращает 1 и так далее. То .forEach перебирает все эти функции одну за другой.

В своем комментарии вы спросили, почему он всегда будет печатать "10", если вы используете var вместо того, чтобы позволить. Причина в следующем масштаб[^] : let имеет область действия блока, var имеет область действия функции (или, если она определена вне функции, как здесь, глобальную область действия). Поэтому, когда вы используете var, затем i всегда будет "то же самое я", потому что оно имеет тот же объем, который не происходит с let, потому что она имеет другую сферу применения.


Member 13814166

Хорошо, я понимаю, но почему, если вместо let i=0 цикл for создал var i=0, функция печатает "10" десять раз? Я бы ожидал, что элементы массива funcs будут иметь те же значения, что и при использовании цикла for let i=0?

Thomas Daniels

Я отредактировал свой ответ; смотрите последний абзац.