2013-01-11 40 views
0

任何人都可以详细说明什么可能会出错吗?我没有真正的线索知道在这一点上要寻找什么。javascript console.log(obj)显示现有属性'上下文'和console.log(obj.context)显示undefined

示例代码:

$.ajax({ 
    url: uploader.fileupload('option', 'url'), 
    context: uploader, 
    success: function(response){ 
     //logging uploader 
     console.log(uploader); 
     //logging this --> logs the same as logging uploader 
     console.log(this); 
     //loggin response --> clearly shows a context attribute holding the correct data for this response 
     console.log(response); 
     //logging response.context --> shows undefined 
     console.log(response.context) 

     var done = uploader.fileupload('option','done'); 
     done.call(this, null, response); 
    }, 
    dataType:"json" 
}) 

我不习惯与环境中工作的属性在$阿贾克斯()调用,我怀疑这个功能引起了我的问题。

这段代码在ajax调用后的一段时间导致我的代码出现问题。我很确定这与ASYNC问题无关,因为问题已经存在于原始ajax请求的实际成功回调中。

我禁用了已发送的php头文件,但它保持不变。我试图基于另一个话题,这意味着我的头文件可能有问题。 我也禁用了$ .ajax()中的dataType attr,但是我的响应没有被识别为json。

如何调试的任何帮助或提示,非常感谢!

更新: 删除ajax调用中的上下文属性确实解决了问题。 但是,为什么当console.logging()

+0

你的“完成”功能是怎样的。我认为它应该是'done.call(this,response)',但是因为你使用上下文,你也可以执行'this.done(response)' –

+1

'console.log(JSON.stringify(response))''给你什么? – Matt

+0

您确定响应正在被视为JSON并被解析为对象吗?也许'response'只是一个字符串。 (尝试做'console.log(typeof response)'检查) – hugomg

回答

3

我的响应对象(或至少似乎被追加)后,我不知道这是否是你的问题,因为问题本身应该更好地指定。但看看标题,看起来console.log()是异步并通过引用传递的普通老问题。

当您拨打console.log(object)时,该对象将保留为参考,不会立即打印。一段时间后,当记录实际发生时,对象可能处于不同的状态(例如,在这种情况下,它可能有一个属性)。

与此相反,当您登录obj.property时,调用是同步的,该属性尚未定义。

+0

显然我误解你自己的答案xD。但我仍然认为这个问题很好解释。 由console.log是异步的,我以为你在ajax调用完成之前指向运行代码,因此为什么它是未定义的。但你的意思是控制台。日志是异步的。 – Bodybag

+0

那你怎么解释console.log(object.context)确实说它是未定义的?就像它真的是......为什么这不是异步执行?还是我缺少别的东西? 无论如何,如果我正确理解这一点,我的第一个结论将警示更好的调试,因为它显示警报()时的实际值 - 调用 – Bodybag

+0

@Bodybag执行回调时HTTP请求已经返回,对此毫无疑问。我不能*解释*发生了什么,因为你的代码片段无法运行,反正它不是你真正的代码。我只想指出一个颇为怪异的例子 – Raffaele