JQuery.ajax() принимает аргумент settings
. Функции для success
или error
(например) выполняются в контексте этого объекта.JQuery.ajax() делает копию объекта настроек?
var arr = [];
var a = {
url : '/',
arbiteraryProperty: 'yeah!',
complete:function() {
console.dir(arr[0]);
}
};
arr.push(a);
$.ajax(a);
запускает команду, а затем выводит атрибуты первого элемента обр (что а) следующим образом:
arbiteraryProperty : "yeah!" url : "/" complete : function()
Теперь проблема заключается в том, что this
ключевого слова внутри выше complete
функция на самом деле не ссылается на объект settings
. Это интересно, потому что кажется, что JQuery делает копию объекта settings
.
var arr = [];
var a = {
url : '/',
arbiteraryProperty: 'yeah!',
complete:function() {
console.log(this.arbiteraryProperty);
//this prints 'yeah!'
this.arbiteraryProperty = 'nope!';
console.log(this.arbiteraryProperty);
//this prints 'nope!' so the value of the attribute in this is changed
console.log(a.arbiteraryProperty);
//this prints 'yeah!' ie. the value originally existed in the settings object
}
};
arr.push(a);
$.ajax(a);
Вопрос в следующем: действительно ли JQuery создает дубликат копии объекта настройки? И если да, как я могу заставить его использовать мой объект?
У меня есть приложение, в котором мне нужно сохранить эти объекты в очереди и ожидать, что они будут обновлены при их запуске. Я предполагаю, что одна из альтернатив - использовать настройки context
для $.ajax()
. Однако это поведение этой функции (создание копии объекта настроек) не было документировано. Или я пропустил это?
Любой объект внутри этой структуры, вероятно, будет ссылаться (не может быть уверен, это может быть глубокая копия). Если это так, это означает, что вы можете сделать '{context: {variable: 3}, complete: function() {this.context.variable = 2}}'. – Dave
Вы можете просто сделать одно из свойств (например, 'arbiteraryProperty') для вашего объекта в очереди, которая должна быть обновлена, поскольку вы можете видеть, что вы все еще можете получить к ней доступ из скопированного объекта. – Bergi
@Dave Не все ли свойство 'context', чтобы изменить то, что означает' this'? Таким образом, это будет просто 'this.variable', а не' this.context.variable'. –