Вы путаете несколько вещей здесь; this
и замыкания - это две совершенно разные проблемы.
Ваша проблема здесь в том, что вы пытаетесь обратиться к f2
напрямую, тем самым предполагая, что this
является частью текущей области выполнения. Это не .
Если вы поставите f2
на this
, вам придется ссылаться на него как this.f2
. Чтобы иметь возможность ссылаться на f2
напрямую, вам нужно объявить (отдельную) переменную с этим именем, которую затем вы можете присвоить this
, если хотите, как говорит qwertymk .
Лично я стараюсь избегать this
столько, сколько могу, так как его значение полностью зависит от того, как вызывается функция (например, если AAA
вызывается без указания оператора new
, this
будет обратитесь к глобальному объекту!). Это также спасает вас от головной боли, как та, что выше. Замыкания (как продемонстрировано Elian ) - намного лучший способ получить эту функциональность.
Интересно, что я обнаружил, что едва ли мне нужно , чтобы использовать this
.
В примере Элиана f2
является закрытым по : после выполнения функции AAA никто не сможет получить доступ к f2, кроме функций, которые были определены внутри AAA (и все еще доступны). В этом случае функция f1
доступна из возвращенного объекта, так что она все еще существует. Следовательно, f1
все еще может использовать f2
.
В этом суть замыканий: функция все еще может получить доступ ко всем переменным в своей области действия, даже если эти переменные были объявлены в завершающей функции.