我一直试图调试这一整天,这完全令人困惑。寻找一些提示。
我在javascript命名空间中有这些函数:
var ZZ = {
bar: function(data) {
console.log(data);
},
foo: function() {
$.ajax({
'url':'/test',
'type':'GET',
'dataType':'jsonp',
'success':function(ret_json, status) {
console.log(ret_json); // SUCCESS_1
console.log(ret_json[1].title); //SUCCESS_2
bar(ret_json);
}
});
},
...
}
所以我看一下开发者工具的'net'选项卡,返回的json是正确的......类似于:
[{'id':1, 'url':'http://a.com', 'title':'hi'}, {'id':2, 'url':'http://b.com', 'title':'hi2'}]
现在我看一下控制台,看看在SUCCESS_1,它会输出如下内容:
[{'id':1, 'url':'http://c.com', 'title':'hi3'}, {'id':2, 'url':'http://c.com', 'title':'hi3'}]
正如您所看到的,ID是正确的,但url和title不是。 (我也可以更改数据库中的ID,它们将被正确地执行)
然后是SUCCESS_2的下一行,它抓住了正确的标题! 'HI2'
接下来我将调试器语句放入success函数中: ret_json看起来完全正确,但当我进入bar()函数时......数据再次看错了。
接下来我添加:
var hi = {};
console.log(hi);
进入成功函数..它打印出来..(不是开玩笑)
{'url':'http://c.com', 'title':'hi3'}
所以基本上,这个“默认”是覆盖实际存在的任何东西。
我已经添加了cache:false到ajax调用,我已经尝试过json和jsonp,我试过清除缓存,我尝试过使用chrome / safari / firefox ..但没有做什么,我怀疑它是什么的那显而易见......这真的很有效。
我可以尝试的任何其他想法吗?
更新:将此命名空间添加到其他html页面。
最令人震惊的例子var hi = {}
console.log(hi)
打印的东西不见了
但仍存在ret_json错误数据的原始问题。
(我仍然无法访问上一个html页面的工作版本)
答案 0 :(得分:2)
@ ggez44,这是因为console.log不是Chrome / Firefox / Safari中的同步调用。通常有几毫秒的延迟。
它在我的机器上看起来延迟不是恒定的,在Chrome中为4ms到16ms,在Safari中为2ms。
http://techblog.appnexus.com/2011/webkit-chrome-safari-console-log-bug/
Bizarre console.log behaviour in Chrome Developer Tools
我对此的推测性解决方案是执行类似“console.log(a.toJSON());”的操作。然后你最终得到一个指向传入的字符串对象的指针,该对象没有绑定到原始对象。
更新:显然这是一个“功能,而不是一个bug”。 webkit邮件列表中的票证有一些相当不错的链接。 Why does javascript object show different values in console in Chrome, Firefox, Safari?
答案 1 :(得分:1)
您是否在代码中的任何位置添加了以下内容?
Object.prototype.url = "http://c.com";
Object.prototype.title = "hi3";
这是创建空对象时这些属性显示的唯一原因。