Каждый раз, когда функция вызывается с использованием вызова функции *, значение this
устанавливается равным глобальной переменной (или undefined
в строгом режиме) - даже если вы вызываете функцию из метода.Дуглас Крокфорд на самом деле назвал это недостатком языка.
Сохранение значения this
в переменной, к которой у функции будет доступ, является стандартным способом решения этой проблемы.
Если вы действительно хотите контролировать то, чтоthis
находится в вашем обратном вызове, вы можете использовать apply
или call
.Оба принимают в качестве первого аргумента значение, которое вы хотите установить для this
.Разница в том, что apply
ожидает, что все аргументы функции будут переданы в виде массива, а call
ожидает, что вы перечислите их по отдельности.
Так что, если в вашем обратном вызове ajax вы хотите позвонить manageIframeResponse
, передайте ему ответ на вызов ajax (я знаю, что ваш пример не прошел ответ, я просто иллюстрирую, как вы это сделаете) и иметь значение this
, совпадающее с текущим объектом, вы можете сделать:
var self = this;
$.ajax({
success : function(response){
manageIframeResponse.apply(self, [response]); //<--- apply wants your arguments in array form
}
});
Или, так как ваши параметры еще не в форме массива, вы могли бы проще использовать call
var self = this;
$.ajax({
success : function(response){
manageIframeResponse.call(self, response); //<---call takes the arguments listed out one at a time
}
});
* Существуют разные способы вызова функции.
Вызов функции означает, что вы просто вызываете функцию, которая оказывается в вашей текущей области:
foo() //inside foo, this will be the global object (or undefined in strict mode)
Вызов метода означает, чтоВы вызываете функцию, прикрепленную к объекту
myObj.foo() //inside foo, this will be myObj
Вот пример того, как это может сбить вас с толку, если вы неосторожны.
function objCreator() {
var y = "There";
function privateFunc() {
alert(y); //alerts There as expected
alert(this.someField); //undefined: whoops - this is the global object,
} //so there's no someField
return {
x: "Hi",
someField: "blah",
foo: function () {
alert(this.x);
privateFunc();
}
};
}