Причина, по которой вам нужно использовать «results.push (res)» вместо «this.results.push (res)», является то, что контекст «это» изменился и не указывает на глобальную контекст больше (под которым определяется массив результатов). Вместо этого это указывает на элемент изображения, который вызвал событие ошибки. Также обратите внимание, что «этот» контекст «fun1» будет зависеть от вызывающего объекта. Если он вызывается в глобальной области видимости, тогда будут определены «this.results», иначе он будет неопределенным (в рамках fun1). Кроме того, это также зависит от того, определена ли функция в режиме «строгого» или «нестрогого».
Скажите, что у вас есть три разных элемента изображения и один и тот же обработчик событий во всех функциях, «это» будет отличаться во всех них. Фактически в каждой функции «это» будет соответствовать элемент DOM, который вызвал событие ошибки (image1, image2 или image3), так как Felix Kling уже писал по комментариям.
Кроме того, я хотел бы указать, что вы действительно можете иметь действительную функцию обработчика событий ошибки, в которой «this.results» будет работать. Для этого вам нужно будет вызвать функцию обработчика ошибок, используя методы «вызов», «применить» или «привязать», которые позволят вам изменить контекст этого внутри функции.
Вы могли бы сказать:
// define your onError event handler
var onError = function() {
var endtimer = new Date().getTime();
res = (endtimer - starttimer);
this.results.push(res);
$('#results').html("" + res + "ms");
};
// now call it this way
$(imag).attr('src', str1 + ':8886/').error(onError.bind(this));
Конечно, таким образом, используя «это» вы не могли получить доступ к свойствам изображения в контексте этого изменилось (в вашем примере вы не используете свойство изображения, так что нет вред здесь).
Чтобы лучше понять глобальный контекст javascript и контекст функции, читайте больше на https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/this.
Надеюсь, это поможет.
Почему 'this.results'? – elclanrs
Как и большинство методов jQuery, которые принимают обратный вызов, внутри обратного вызова 'this' относится к выбранному элементу DOM. И элементы изображения не имеют свойства 'results'. –
Также взгляните на [этот вопрос] (http://stackoverflow.com/questions/14220321/how-to-return-the-response-from-an-ajax-call), я думаю, что он может применяться здесь – elclanrs