Javascript jQuery ajax上下文意外值
考虑以下示例,在尝试提供上下文时使用jQuery(v1.8.3)Javascript jQuery ajax上下文意外值,javascript,jquery,jquery-deferred,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对象?在对jQuery v1.8.3源代码进行了一些挖掘之后,我发现: 7645 | // Create the final options o
ajax()
方法
for(var i=0; i<3; i++) {
$.ajax({
url: "foo",
context: i,
success: function() { console.log(this); }
}
为什么我没有收到3个
Number
对象?在对jQuery v1.8.3源代码进行了一些挖掘之后,我发现:
7645 | // Create the final options object
7646 | s = jQuery.ajaxSetup( {}, options ),
7647 | // Callbacks context
7648 | callbackContext = s.context || s,
这意味着只要ajax()
调用的context
选项无效,作为此上下文参数分配给回调的值就是jQuery.ajaxSetup()
返回的对象
请注意,将任何falsy值作为上下文
选项传递将导致此行为,包括0
、null
和”
我相信一个小小的改变可以消除这种模糊性,我会向jQuery开发团队提交一张罚单,但是我不知道他们是否会喜欢一个破坏了一半互联网的向后不兼容的改变:(
在对jQuery v1.8.3源代码进行了一番挖掘之后,我发现:
7645 | // Create the final options object
7646 | s = jQuery.ajaxSetup( {}, options ),
7647 | // Callbacks context
7648 | callbackContext = s.context || s,
这意味着只要ajax()
调用的context
选项无效,作为此上下文参数分配给回调的值就是jQuery.ajaxSetup()
返回的对象
请注意,将任何falsy值作为上下文
选项传递将导致此行为,包括0
、null
和”
我相信一个小小的改变可以消除这种模糊性,我会向jQuery开发团队提交一张罚单,但是我不知道他们是否会喜欢一个破坏了一半互联网的向后不兼容的改变:(
如果你尝试这样的方法会有帮助吗
for (var i = 0; i < 3; i++) {
(function () {
$.ajax({
url: "foo",
context: i,
success: function () {
console.log(this);
}
});
})(i);
}
但当然,这只适用于您的代码,因为您使用的是这样的整数。如果您传递的是其他错误的值,这可能就不那么容易了。尝试类似的方法是否有帮助?:
for (var i = 0; i < 3; i++) {
(function () {
$.ajax({
url: "foo",
context: i,
success: function () {
console.log(this);
}
});
})(i);
}
但当然,这只适用于您的代码,因为您使用的是这样的整数。如果您传递的是其他错误的值,这可能就不那么容易了。它尝试将成功回调与上下文绑定(并将其转换为对象)
因此,如果您提供一个数字,那么它将绑定它,如下所示:
var a=12;
var test = function(){ console.log(this.valueOf())}.bind(a)
test();
您可以将Ian的技术用于“+this”而不是“this.valueOf()”,只是这也适用于字符串。它尝试将成功回调与上下文绑定(并将其转换为对象)
因此,如果您提供一个数字,那么它将绑定它,如下所示:
var a=12;
var test = function(){ console.log(this.valueOf())}.bind(a)
test();
你可以用Ian的技巧来表示“+this”,而不是“this.valueOf()这是一个很好的发现,但它并不能解释为什么0
和2
在这种情况下可以工作,但是1
却不能。不过,OP指出,收到的命令可能不是执行的命令…这是真的,但我没有想到在这样一个简单的例子中会这样。那这是一个很好的发现,但它并不能解释为什么0
和2
在这种情况下有效,但1
不起作用……不过,OP指出,收到的订单可能不是执行的订单……这是事实,但我没想到有这么简单的例子。+1因为我就是这样绕过这个问题的。我仍然是请相信,如果您传递了一个上下文参数,它应该被接收,并且回退应该只在上下文未定义(未提供)时发生。@Aesthete哦,我绝对同意……我不确定为什么现在是这样。我想他们会得到您发布的修改(甚至使用typeof s.context!=“未定义”
而不是!==未定义,所以我想知道为什么不。这可能是去年的疏忽。现在改变这种行为可能太晚了。+1因为我就是这样绕过这个问题的。我仍然认为,如果你传递了上下文参数,它应该被接收,并且只有在上下文未定义(未提供)的情况下才会出现回退@Aesthete噢,我绝对同意……我不知道为什么现在是这样。我想他们会有你发布的修改(甚至使用s.context的类型!==“未定义”
,而不是!==未定义的
),所以我想知道为什么不。这可能是去年的疏忽。现在改变这种行为可能为时已晚。a始终是一个对象,所以不需要转换它。我仍然不认为这是自然行为。不过感谢你的输入+1。a始终是一个对象,所以不需要转换它。我仍然不认为它是自然行为行为。感谢您的输入,尽管+1。