Я хочу иметь цикл, который устанавливает
куча обработчиков кликов и каждый
Обработчику даны уникальные параметры. я
делая что-то вроде этого сейчас:
> for (thisThing in things){
> myDiv=document.createElement('img');
>
> myDiv.onclick=function(){
> // do somehting!
> // but don't do anything with "thisThing"
> // because it's got the wrong value in it by the time you call it!
> // but this function has to have the value of "thisThing" to work,
> dammit!
> } }
Повсеместно решение для этого называется закрытием
Нет, вы вообще не хотите закрытий. Вы пытаетесь не иметь замыкания.
кроме перерывов закрытия, т. Е. (Верно?)
Неправильно.
Была проблема с IE и циклическими ссылками, включающими элементы DOM, вызывающими утечки памяти. Эта проблема была в значительной степени исправлена, однако ее неправильно поняли. Например:
function addListener(element) {
var someVar = ...;
element.onclick = function() {
// this function has a closure to someVar
};
}
Вызывает конкретную ссылку, включающую закрытие someVar при вызове addListener. Было несколько довольно простых исправлений для этого. То, что вы хотите сделать, это , а не иметь замыкание для someVar, но использовать значение. Это можно сделать несколькими способами, но самый простой из них:
function addListener (element) {
var someVar = ...;
element.onclick = (function (differentVar) {
оповещения (differentVar);
}) (SomeVAr);
}
Так что теперь значение для someVar передается в DifferentVar, который является локальной переменной внутренней функции. Конечно, внутренняя функция может все еще иметь замыкание для someVar, но использование использования немедленно вызываемой анонимной функции нарушает замыкание между differentVar
и someVar
.
Как единое целое, с закрытием все равно нет проблем. Но если вы подключаете несколько слушателей, и все они имеют ссылку на someVar , то все они имеют одинаковое значение. Использование немедленно вызываемой анонимной функции между разрывами этой цепочки.
Редактировать
Извините, последний пример неверен, мой плохой.
function addListener(element) {
var someVar = ...;
element.onclick = (function(differentVar) {
return function() {
alert(differentVar);
};
})(someVAr);
}