jQuery ajax context意外值

时间:2012-11-28 06:57:20

标签: javascript jquery jquery-deferred

考虑以下在尝试提供上下文时使用jQuery( v1.8.3 ajax()方法的示例。

for(var i=0; i<3; i++) {
  $.ajax({
    url: "foo",
    context: i,
    success: function() { console.log(this); }
}

预期输出将是3个Number个对象,代表0, 1 and 2(不一定按此顺序。)实际上,控制台的输出是2 Number个对象,1 {{1对象,包含ajax请求数据。

Object

为什么我没有收到3个> Number > Object {url: "foo", isLocal: false, global: true, type: "GET", contentType: "application/x-www-form-urlencoded; charset=UTF-8"…} > Number 个对象?

3 个答案:

答案 0 :(得分:2)

在jQuery v1.8.3源代码中进行了一些挖掘之后,我发现了这个:

7645 | // Create the final options object
7646 | s = jQuery.ajaxSetup( {}, options ),
7647 | // Callbacks context
7648 | callbackContext = s.context || s,

这意味着只要context调用的ajax()选项是假的,分配给回调的值this上下文参数就是jQuery.ajaxSetup()返回的对象。

请注意,将任何虚假值传递为context选项会导致此行为,包括0null""

我相信一个小小的改变可以消除这种模糊性,我会向jQuery开发团队提交一张票,但是我不知道他们是否会理解一个向后不相容的变化,它打破了互联网的一半:(

callbackContext = s.context !== undefined ? s.context : s

答案 1 :(得分:1)

如果你尝试这样的话会有帮助吗?:

for (var i = 0; i < 3; i++) {
    (function () {
        $.ajax({
            url: "foo",
            context: i,
            success: function () {
                console.log(this);
            }
        });
    })(i);
}

但是从Esthete发现的东西开始,也许你可以在定义context时转换为字符串,然后转换回success内的整数...类似于:

for (var i = 0; i < 3; i++) {
    $.ajax({
        url: "foo",
        context: ""+i,
        success: function () {
            console.log(+this);
        }
    });
}

但是,当然,这只适用于您的代码,因为您使用的是这样的整数。如果你传递其他虚假的价值,这可能并不容易。

答案 2 :(得分:1)

它尝试将成功回调与上下文绑定(并将其转换为对象)。

因此,如果您提供一个数字,那么它将绑定它:

 var a=12;
 var test = function(){ console.log(this.valueOf())}.bind(a)
 test();

你可以使用Ian的技术“+ this”而不是“this.valueOf()”,只是这也适用于字符串。