Добро пожаловать в мир замыканий.Вы правы, когда чувствуете, что чувствуете себя так, будто ведете себя глобально, но не совсем глобально.Вот как ведут себя замыкания.
В основном в javascript, когда функция возвращает не все локальные переменные, это обязательно сборщик мусора / освобождается, как в Java или C. Если есть ссылка на эту переменную, то эта переменная выживает в области действияфункция, в которой она определена.
Технически механика различна, и некоторые люди пытаются объяснить это таким образом и в конечном итоге путают многих других людей.Для меня замыкания являются своего рода «частными» глобальными переменными в том смысле, что они являются глобальными, они являются общими для всех функций, но они не объявлены в глобальной области видимости.Это то же самое, что вы описываете, ощущая при знакомстве с этой функцией.
Вот некоторые из моих других ответов здесь по поводу переполнения стека, связанных с закрытиями javascript, которые, я считаю, стоит прочитать:
Скрытые функцииJavaScript?
Пожалуйста, объясните использование замыканий JavaScript в циклах
Или вы можете просто использовать фразу "закрытие javascript", чтобы изучить тему.
Дополнительный ответ.
Что касается объяснения того, почему this
работает в вашем коде (в отличие от * кашля * попытки исправить ваш код так, чтобы this
работал дажехотя он работает в исправленной версии * кашель *; -):
Javascript имеет поздние привязки.Очень поздно, очень-очень поздно.this
не только не связан во время компиляции, он даже не связан во время выполнения.Он ограничен во время выполнения, то есть до тех пор, пока не будет вызвана функция, вы не можете знать, на что это действительно указывает.Вызывающий в основном решает, что является значением this
, а не функцией, где используется this
.
Некоторые забавные маневры позднего связывания с JavaScript:
function foo () {
alert(this.bar);
}
var bar = "hello";
var obj = {
foo : foo,
bar : "hi"
};
var second_obj = {
bar : "bye"
};
foo(); // says hello, 'this' refers to the global object and this.bar
// refers to the global variable bar.
obj.foo(); // says hi, 'this' refers to the first thing before the last dot
// ie, the object foo belongs to
// now this is where it gets weird, an object can borrow/steal methods of
// another object and have its 'this' re-bound to it
obj.foo.call(second_obj); // says bye because call and apply allows 'this'
// to be re-bound to a foreign object. In this case
// this refers to second_obj
В вашем коде, this
удобно относится к объекту, вызывающему функцию как к ее методу, поэтому она работает, даже если вы явно не используете предположительно правильный синтаксис конструктора.