用奇怪的值初始化Javascript对象

时间:2012-06-25 19:15:12

标签: javascript jquery

我一直试图调试这一整天,这完全令人困惑。寻找一些提示。

我在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页面的工作版本)

2 个答案:

答案 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";

这是创建空对象时这些属性显示的唯一原因。