function d() {
function e() {
alert('E');
}
return e;
}
d()();
//alerts 'E'
Ссылка не требуется, поскольку она явно преобразуется в возвращаемое значение.Если не сохранено, результат выражения JavaScript (последовательность интерпретируемых переменных, функций и / или операций, возвращающих значение) будет полностью оценен и затем удален из памяти.Ключ в том, что оно должно быть fully evaluated
.Вы можете почти представить себе функциональное исполнение как горизонтальные русские матрешки.Выражение JavaScript выглядит так:
d()();
Таким образом, оно начинается слева направо:
d()
, которое выполняется и возвращает:
function e() { ... }
, которое поворачиваетсястрока в:
function e() { ... }()
, которая затем выполняется, предупреждает и возвращает:
//nothing
Полное выражение завершено.Для этого ничего не осталось.Ссылка нигде не сохраняется, и сразу после разрешения этого выражения все, что было возвращено из его оценок, выбрасывается.