После этой строки кода:
var a = foo;
a
указывает на ту же функцию, на которую указывает foo
. В
foo = bar;
Вы переназначаете foo
, чтобы указать на то, на что ссылается bar
. Это не обновляет ссылку a
- оно по-прежнему указывает на функцию, на которую foo
также изначально указывал.
Теперь, когда вы запускаете a()
, выполняется оригинальная функция. Он захватывает foo
(который теперь указывает на ссылку bar
) и получает свойство val
. val
объекта bar
равен 2, так что это то, что возвращается.
Это немного сложно объяснить словами ... может быть, диаграмму будет легче понять?