есть ли более элегантный способ?
Да, в пятом издании ECMAScript:
setTimeout(this.updateTime.bind(this), 1000);
Однако до тех пор, пока все браузеры не будут поддерживать Пятое издание (что пока еще не принято), вы должны добавить свою собственную реализацию Function.bind в качестве запасного варианта. eg.:
// Add ECMA262-5 method binding if not supported natively
//
if (!('bind' in Function.prototype)) {
Function.prototype.bind= function(owner) {
var that= this;
if (arguments.length<=1) {
return function() {
return that.apply(owner, arguments);
};
} else {
var args= Array.prototype.slice.call(arguments, 1);
return function() {
return that.apply(owner, arguments.length===0? args : args.concat(Array.prototype.slice.call(arguments)));
};
}
};
}
Вы также можете предпочесть setInterval
, чтобы избежать повторных вызовов setTimeout
. Наконец, вы должны помнить, что все ваши переменные (timeEnd
, diff
и т. Д.) Должны быть объявлены как var
, в противном случае вы получаете случайные глобальные переменные, которые могут вызвать ужасную отладочную боль в сердце.