Итак, вот как это работает:
Функция test
вызывается три раза.Каждый раз, когда создается другой функциональный объект wtf
, который привязывается к DIV в качестве обработчика щелчков.Это означает, что после выполнения приведенного выше кода к DIV будут привязаны обработчики трех щелчков .Когда вы затем нажимаете на DIV, эти три обработчика вызываются последовательно.
Эта строка
var _this = this;
просто сохраняет глобальный объект в локальной переменной _this
.Если функция test
должна вызываться в среде строгого режима, this
будет undefined
, и код выдаст ошибку.Однако, поскольку это не строгий режим, значение this
относится к глобальному объекту.
Кстати, переменная i
объявлена в глобальном коде, что делает ее глобальной переменной (глобальное свойство).
Эта строка
var foo = _this.foo = i++;
назначает текущее значение i
как локальной переменной foo
, так и _this.foo
.А поскольку _this
является ссылкой на глобальный объект, свойство foo
является глобальным свойством (как и i
).
Теперь, так как мы вызывали функцию test
три раза, есть также три отдельные foo
локальные переменные.Каждая из этих переменных фиксирует значение переменной i
в момент вызова функции test
.Итак, значения этих трех foo
переменных: 0
, 1
и 2
.Эти переменные фиксируются тремя функциями wtf
(соответственно) через замыкание.(Первая функция wtf
захватывает первую переменную foo
и т. Д.)
Однако, в отличие от переменных foo
, в имеется только одно глобальное свойство foo
,Таким образом, после каждого вызова функции test
глобальное свойство foo
увеличивается.В результате после трехкратного вызова test
значение _this.foo
равно 2
.(Это до нажатия кнопки DIV.)
Теперь, когда нажата кнопка DIV, будут выполнены три функции wtf
.Каждая из этих функций напечатает значение _this.foo
, равное 2
.Однако каждая из этих wtf
функций захватила различную переменную foo
через замыканиеЗначения этих трех foo
переменных равны 0
, 1
и 2
соответственно.