【问题标题】:javascript console.log(obj) showing existing property 'context' and console.log(obj.context) shows undefined [duplicate]javascript console.log(obj) 显示现有属性“context”,console.log(obj.context) 显示未定义 [重复]
【发布时间】:2013-01-11 23:22:41
【问题描述】:

谁能详细说明可能出了什么问题?在这一点上,我不知道要寻找什么。

示例代码:

$.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() 调用中使用 context 属性,我怀疑这个功能会导致我的问题。

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

我已禁用发送的 php-headers,但它保持不变。我根据另一个主题尝试了这个,这意味着我的标题可能有问题。 我还禁用了 $.ajax() 中的 dataType attr,但是我的响应不被识别为 json。

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

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

时它会被附加到我的响应对象中(或者至少似乎被附加了)

【问题讨论】:

  • 您的done函数看起来如何。我认为应该是done.call(this,response),但由于您使用上下文,您也可以使用this.done(response)
  • console.log(JSON.stringify(response)) 带给你什么?
  • 您确定响应被视为 JSON 并被解析为对象吗?也许response 只是一个字符串。 (尝试做console.log(typeof response)检查)
  • @Matt -> console.log(JSON.stringify(response)) 给出了正确答案并且不包含上下文属性..
  • @Bodybag:因为console.log(typeof response) outputs objectconsole.log(response.context) 显示undefinedconsole.log(response); 拥有上下文属性,我认为您稍后会以某种方式添加它。就像 Raffaele 说的,控制台显示了对象的实际内容,而不是您执行 console.log 时的内容,因此如果您稍后在查看其内容之前对其进行更改,您将在控制台中看到这些更改。

标签: javascript properties


【解决方案1】:

我不确定这是否是您的问题,因为应该更好地说明问题本身。但是看标题,console.log() 异步并通过引用传递似乎是一个简单的老问题。

当您调用console.log(object) 时,该对象被保留为参考并且不会立即打印。一段时间后,当实际发生日志记录时,对象可能处于不同的状态(例如,在本例中,它可能具有属性)。

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

【讨论】:

  • 显然我自己看错了你的答案xD。但我仍然认为这个问题得到了很好的解释。由于 console.log 是异步的,我认为您是在 ajax 调用完成之前指向正在运行的代码,因此它是未定义的。但你的意思是 console.log 是异步的。
  • 你怎么能解释console.log(object.context) 确实说它是未定义的?就像真的一样......为什么这不是异步执行的?还是我错过了其他东西?无论如何,如果我正确理解这一点,我的第一个结论是 alert 更适合调试,因为它确实显示了 alert()-call 时的实际值
  • @Bodybag 回调执行的时候HTTP请求已经返回了,这个不用怀疑。我无法解释发生了什么,因为您的 sn-p 无法运行,而且无论如何都不是您的真实代码。我只是想指出一个相当奇怪的案例
猜你喜欢
  • 1970-01-01
  • 2019-06-18
  • 2019-12-07
  • 2013-10-31
  • 2015-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多