То, что вы видите, является эффектом закрытия . Функция, определяемая в другой функции, получает доступ ко всем переменным, например, в области видимости & mdash; даже после того, как внешняя функция вернется. Подробнее здесь , но в основном все переменные (и аргументы) в функции существуют как свойства объекта (называемого «переменным объектом»), связанного с этим вызовом функции. Поскольку функция, которую вы связали с this.add
, определена в этом контексте, она имеет постоянную ссылку на этот объект, предотвращая сборку мусора, что означает, что эта функция может продолжать обращаться к этим свойствам (например, переменные и аргументы функции).
Обычно вы слышите, как люди говорят, что функция закрывается над переменной x
, но она более сложная (и интересная), чем эта. Это доступ к переменному объекту , который сохраняется. Это имеет значение. Например:
function foo() {
var bigarray;
var x;
bigarray = /* create a massive array consuming memory */;
document.getElementById('foo').addEventListener('click', function() {
++x;
alert(x);
});
}
На первый взгляд, мы видим, что обработчик кликов использует только x
. Так что он имеет ссылку только на x
, верно?
Неверно, ссылка на переменный объект, который содержит x
и bigarray
. Таким образом, содержимое bigarray
будет также сохраняться, даже если функция их не использует. Это не проблема (и часто это полезно), но она подчеркивает основной механизм. (И если вам действительно не нужно содержимое bigarray
в обработчике кликов, вы, возможно, захотите сделать bigarray = undefined;
перед возвратом из foo
, просто чтобы освободить содержимое.)