Вы можете заключить назначение в функцию или как минимум в правую часть:
objects[i].callback = (function(i) { return function(e, x, y) {
cb(e, x, y, i);
})(i);
«Внешняя» анонимная функция вызывается сразу, копируя переменную цикла «i» в аргумент (который я также назвал «i»; некоторые думают, что делать это непонятно, в то время как другие говорят, что это сбивает с толку не *) 1005 *, чтобы сделать это, так что вы можете решить :-), который затем используется возвращенной «внутренней» анонимной функцией.
Другим подходом к этой проблеме будет использование для этой цели вспомогательной функции вместо простой встроенной анонимной функции. В этом случае это делается немного хитро, потому что вы хотите, чтобы «i» было параметром last фактической функции обратного вызова. Библиотека JavaScript Functional имеет классную утилиту, которая позволяет вам «предварительно заполнить» выбранные аргументы функции фиксированными значениями, предоставляя вам функцию, позволяющую передавать аргументы нефиксированным; это будет выглядеть примерно так:
objects[i].callback = (function(e, x, y, i) { return cb(e, x, y, i); }).partial(_, _, _, i);
Хорошо это или плохо, это вопрос стиля и мнения.
edit только что выпил немного кофе - я думаю, что я был немного глупым, думая, что мне нужно использовать "partal ()" выше. Тот факт, что внутренняя («настоящая» функция) хочет «i» в конце списка параметров, на самом деле не имеет отношения к тому, как все должно быть настроено. Вышеприведенный пример также можно сделать так:
objects[i].callback = (function(i, e, x, y) { return cb(e, x, y, i); }).curry(i);
что гораздо менее странно. (Любой из них будет работать, однако. По крайней мере, я думаю, что они будут.: -)