Я работаю над библиотекой Javascript, в которой я не могу загрязнять глобальное пространство имен, и все мои переменные должны содержаться в одной или двух глобальных переменных. В настоящее время я столкнулся с особым случаем, когда мне нужно использовать замыкания, но то, что я обычно пытаюсь сделать, не работает, и это беспокоит меня в течение некоторого времени. Поиск дал мне только традиционный метод закрытия, который я обычно использую.
[...]
addFilters: function(filters) {
for(filter in filters) {
this.filters[filter] = filters[filter];
this.Image.prototype[filter] = function() { //closures, how do they work?
return (function(image, filter, arguments) {
image.addQueue(filter, arguments);
})(this, filter, arguments);
};
}
},
[...]
В приведенном выше фрагменте функции Image.prototype (и image.addQueue) неправильно захватывают «фильтр», поэтому каждый раз устанавливается последний фильтр в итерации for..in.
Полный код с выделенными соответствующими разделами: http://pastebin.com/UVFTVPkh
Живая демонстрация: http://ian0.com/code/js/ube/demo.html< /а>