1

考虑以下在尝试提供上下文时使用 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 个Object对象,其中包含 ajax 请求数据。

> Number
> Object {url: "foo", isLocal: false, global: true, type: "GET", contentType: "application/x-www-form-urlencoded; charset=UTF-8"…}
> Number

为什么我没有收到 3 个Number对象?

4

3 回答 3

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()分配给回调的值就是由.thisjQuery.ajaxSetup()

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

我相信一个小小的改变可以消除这种歧义,我会向 jQuery 开发团队提交一张票,但是我不知道他们是否会欣赏一个打破一半互联网的向后不兼容的改变:(

callbackContext = s.context !== undefined ? s.context : s
于 2012-11-28T06:57:19.797 回答
1

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

所以,如果你提供一个数字,那么它会像这样绑定它:

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

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

于 2012-11-29T22:52:51.307 回答
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);
        }
    });
}

但是,当然,这仅适用于您的代码,因为您使用的是这样的整数。如果您传递其他虚假值,则可能不会那么容易。

于 2012-11-28T07:05:37.930 回答