Функция, которую возвращает bind
, является замыканием над аргументами функции bind
, поэтому аргумент __method
будет первым аргументом bind
(в вашем примере вызова , это будет функция this.eventSource.addListener
).
Замыкания - это, в основном, функции, в которые встроены данные. Вот более простой пример:
function makeAlert(msg) {
return function() {
alert(msg);
}
}
var myalert = makeAlert("Hi there!");
myalert(); // Alerts "Hi there!"
Функция, возвращаемая makeAlert
, «закрывает» (сохраняет доступ) объекты в области действия в вызове функции makeAlert
, который ее создал, включая аргумент msg
. Вот почему, когда мы вызываем функцию позже, она все еще имеет msg
, хотя вызов к makeAlert
давно завершен. Подробнее о замыканиях здесь.
Ключевым моментом, который следует помнить о замыканиях, является то, что они сохраняют доступ к всему , находящемуся в области их определения, а не только к тем вещам, которые они явно используют. Так, например:
function init() {
var data;
data = /* ...build some really big array of data...*/;
document.getElementById('foo').onclick = function() {
this.style.display = "none";
};
}
Хотя обработчик событий не имеет ничего общего с массивом больших данных, он сохраняет ссылку на него и сохраняет эти данные в памяти после завершения вызова init
. Это связано с тем, что он имеет ссылку на скрытый объект (условно называемый «переменным объектом»), который является контейнером для всех аргументов и локальных переменных в области действия, в которой он определен. (В этом конкретном случае, если вам не нужны все эти данные, просто установите data
в undefined
в конце. Обработчик события все равно будет иметь ссылку на data
, но эта ссылка не содержит массив, так что память массива может быть восстановлена.)