3

JQuery.ajax()接受一个settings参数。successor的函数error(例如)在这个对象的上下文中运行。

var arr = [];
var a = {
    url : '/',
    arbiteraryProperty: 'yeah!',
    complete:function () {
        console.dir(arr[0]);
    }
};

arr.push( a );

$.ajax( a );

运行命令,然后打印 arr 的第一个元素(即 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(). 但是,此函数的这种行为(制作设置对象的副本)并未记录在案。还是我错过了?

4

1 回答 1

6

是的,当您调用jQuery.ajax(). 结果是您传递的设置对象和全局jQuery.ajaxSettings对象的组合,因此您拥有正确的默认值和全局设置的任何设置,即使您没有在传递的对象中明确设置它们。

这可以在第 7745 行的 jQuery 1.9的源代码中看到:

// Create the final options object
s = jQuery.ajaxSetup( {}, options ),

通常,您使用该属性为回调函数内部context指定不同的值,因此:this

options = {
    url: '/',
    ...,
    context: a
}

但是,如果合并执行深层复制,则您的情况下的循环引用(a在其属性之一中引用自身)可能会导致问题。

于 2013-04-03T10:30:38.940 回答