【问题标题】:Defining this objects is making another undefined?定义这个对象会导致另一个未定义?
【发布时间】:2011-05-03 08:58:25
【问题描述】:

我有这个代码:

sys.puts(JSON.stringify(data[0].name));

var userData = {
    name: data[0].name,
    screenname: data[0].screen_name,
    id: data[0].id,
    url: data[0].url,
    description: data[0].description
 }

当我注释掉 userData 对象的创建时,一切正常,这意味着它将该值正确写入控制台。当我把它放回去时,我得到了这个错误:

sys.puts(JSON.stringify(data[0].name));
                    ^
TypeError: Cannot read property 'name' of undefined

任何想法为什么会发生这种情况?这都在同一个函数中。

【问题讨论】:

  • 可能是一个显而易见的问题,但您确定这段代码只执行一次吗?就我而言,我有两个同时执行相同代码的回调,一个填充了data[0],一个没有;所以看起来值神奇地消失了,但实际上是第二个没有数据的调用。
  • 这看起来像是 minimal test case 的工作。原样的代码不完整,因此问题不可重现。
  • 谢谢大家,我还不太明白发生了什么,但这绝对是一个回调问题。我为不同的事物调用相同的函数并传入不同的回调,或者我是这么认为的。调试我将它分成两个函数并使回调静态并解决了问题,现在我只需要弄清楚我做错了什么。不管怎样,谢谢你把我推向那个方向。

标签: javascript debugging object node.js


【解决方案1】:

在访问对象属性之前使用guard operator 验证对象:

JSON.stringify(!!window["data"] && data.hasOwnProperty("length") && data[0].hasOwnProperty("name") && data[0].name)

也可以使用 try/catch 块:

try
  {
  JSON.stringify(data[0].name)
  }
catch(e)
  {
  throw("Error")
  }

参考文献

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-02
    相关资源
    最近更新 更多