//Lets start with a basic Javascript snippet
function generateCash() {
var denomination = [];
for (var i = 10; i < 40; i += 10) {
denomination.push(i);
}
return denomination;
}
Это базовый оператор функции в Javascript, который возвращает массив [10,20,30]
//--Lets go a step further
function generateCash() {
var denomination = [];
for (var i = 10; i < 40; i += 10) {
denomination.push(console.log(i));
}
return denomination;
}
. Это будет печатать 10, 20, 30 последовательно во время итерации цикла, но будетвернуть массив [undefined, undefined, undefined], основная причина в том, что мы не выдвигаем фактическое значение i, мы просто распечатываем его, следовательно, на каждой итерации движок javascript будет устанавливать его как undefined.
//--Lets dive into closures
function generateCash() {
var denomination = [];
for (var i = 10; i < 40; i += 10) {
denomination.push(function() {
console.log(i)
});
}
return denomination;
}
var dn = generateCash();
console.log(dn[0]());
console.log(dn[1]());
console.log(dn[2]());
Это немного сложно, как вы ожидаете, будет ли результат, [10,20,30]?Ответы нет, давайте посмотрим, как это происходит.Сначала создается глобальный контекст выполнения, когда мы создаем dn, также у нас есть функция generatecash ().Теперь мы видим, что, поскольку цикл for повторяется, он создает три объекта анонимной функции, и может возникнуть соблазн думать, что console.log внутри функции push тоже запускается, но на самом деле это не так.Мы вызывали generateCash (), поэтому функция push просто создает три объекта анонимной функции, но не вызывает функцию.В конце итерации текущий локальный контекст извлекается из стека выполнения и покидает состояние i: 40 и arr: [functionobj0 (), functionob1 (), functionobj2 ()].
Итаккогда мы начинаем выполнять последние три оператора, все они выводят 40, поскольку он не может получить значение i из текущей области видимости, он идет вверх по цепочке областей и обнаруживает, что значение i было установлено равным 40.Причина, по которой все они будут запускаться 40, заключается в том, что каждый отдельный компонент dn находится в одном и том же контексте выполнения, и все они, будучи не в состоянии найти значение i в своей текущей области видимости, будут подниматься по цепочке областей действия и обнаружат, что я установлен как40 и выведите его соответственно