考虑以下在尝试提供上下文时使用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
个对象?
答案 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
选项会导致此行为,包括0
,null
和""
。
我相信一个小小的改变可以消除这种模糊性,我会向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()”,只是这也适用于字符串。