Я всегда думал, что большинство компиляторов в эти дни достаточно умно, чтобы сделать последнюю опцию. Принятие этого имеет место, я сказал бы, что первый действительно выглядит более хорошим также. Если цикл становится очень большим, нет никакой потребности посмотреть все вокруг для того, где o объявляется.
также взгляните на похожий сценарий Джеймса (объявляется как метод объекта jquery, а не как событие)
jQuery.fn.watch = function( id, fn ) {
return this.each(function(){
var self = this;
var oldVal = self[id];
$(self).data(
'watch_timer',
setInterval(function(){
if (self[id] !== oldVal) {
fn.call(self, id, oldVal, self[id]);
oldVal = self[id];
}
}, 100)
);
});
return self;
};
jQuery.fn.unwatch = function( id ) {
return this.each(function(){
clearInterval( $(this).data('watch_timer') );
});
};
и создание специального события
jQuery.fn.valuechange = function(fn) {
return this.bind('valuechange', fn);
};
jQuery.event.special.valuechange = {
setup: function() {
jQuery(this).watch('value', function(){
jQuery.event.handle.call(this, {type:'valuechange'});
});
},
teardown: function() {
jQuery(this).unwatch('value');
}
};
В любом случае, если оно вам нужно только как событие, ваш сценарий хорош :)