JavaScript对象从Chrome开发工具中可用的函数返回,但不是从脚本返回

JavaScript object returned from function available in Chrome Dev Tools, but not from script

本文关键字:返回 脚本 函数 Chrome 对象 开发工具 JavaScript      更新时间:2023-09-26

编辑

我在那里有点快,问题出现在函数中,而不是我第一次说的地方。以下是功能:

function returnAnObject(url) {
  var apiurl = 'http://url.com';
  var info = {};
  $.getJSON(apiurl, function(data) {
    $.extend(info, {
      a  : data.x,
      b  : data.y,
      c  : data.z
    });
  });
  console.log(info); // Shows object as usual
  console.log(info.a); // Shows undefined
  return info;
}

这样会更清楚吗?

结束编辑

好吧,我有一个小问题。

我有一个函数,它返回一个相当简单的对象,看起来像这样:

{
  a: 'x',
  b: 'y',
  c: 'z'
}

我把它保存到这样一个变量中:

var something = functionThatReturnsObject(someargument);
console.log(something); // In chrome dev tools, I see the object and its values
console.log(something.a); // This, however, logs undefined
console.log(something['a']); // This also logs undefined

为什么会这样?我想我在这里快要疯了,我一定是忽略了什么。。。

如果不是,就会发生真正奇怪的部分

var something = functionThatReturnsObject(someargument);

我写

window.something = functionThatReturnsObject(someargument);
console.log(something); // Still works, showing the object and properties
console.log(something.a); // Still doesn't work
console.log(someting['a']); // Still doesn't work

如果我现在直接从开发工具访问对象,输入

something; // returns object, I can see everything in it etc.
something.a // Now, for some mysterious (to me) reason, this works, returning the value of a

那么,有人明白这里发生了什么吗?

正如我所怀疑的那样。您正在为异步函数调用的成功处理程序中分配信息。成功处理程序直到ajax调用完成后才执行,但您的函数在ajax调用开始后立即返回(并且在它完成并成功之前很久(。你可能不相信,但这是我今天第四次回答完全相同的问题。这是一个很常见的错误。由于内联成功处理程序,这一切似乎都发生在主函数内部,但实际上它发生在该函数完成很久之后。

在调用成功处理程序之前,您不能使用ajax调用的返回结果。如果要将结果传递给后续代码,则必须从成功处理程序中调用该后续代码,而不是在returnAnObject函数调用后继续。

它在开发工具中起作用,因为ajax调用在您向开发工具中键入任何内容或查看时完成。但是,info.a在returnAnObject函数的末尾不可用。只有当调用ajax函数的成功处理程序时,它才可用。