loadingDiv
все еще виден внутри функции onprogress
, поскольку замыкание сформировано. Проблема в том, что он находится в цикле, поэтому к тому времени, когда вызывается onprogress
, loadingDiv
, вероятно, будет присвоено новое значение.
Чтобы обойти это, вы можете использовать дополнительное закрытие, чтобы взять копию текущего значения loadingDiv
:
reader.onprogress= function(myloadingdiv) {
return function(evt) {
if (evt.lengthComputable)
myloadingdiv.innerHTML= evt.loaded/evt.total*100+'%';
};
}(loadingDiv);
В пятом издании ECMAScript метод bind()
сделает это для вас более чисто:
reader.onprogress= function(myloadingdiv, evt) {
if (evt.lengthComputable)
myloadingdiv.innerHTML= evt.loaded/evt.total*100+'%';
}.bind(loadingDiv);
Для браузеров, которые еще не поддерживают bind()
, вы можете внести исправления в реализацию следующим образом:
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)));
};
}
};
}