coffescript/javascript函数数组中真正奇怪的行为

coffescript/javascript函数数组中真正奇怪的行为,javascript,arrays,coffeescript,anonymous-function,Javascript,Arrays,Coffeescript,Anonymous Function,我的代码似乎在chrome中带来了某种量子决斗状态,调用了一个宇宙,在这个宇宙中,函数被推到一个数组中时会变成未定义的。。。可怕的 我正在使用下面的代码构建一个函数数组,以便使用此函数回调将它们链接在一起 奇怪的是,尽管它看起来确实有效;所有具有正确参数的函数调用似乎都在发生,它也会在控制台中得到这些(使用我的格式和注释) 这似乎意味着,尽管它奏效了。。。它也不起作用。。。因为。。。新的_func在被推送到数组时变为未定义 WTF 有人知道这里会发生什么吗 我用的是ChromeV21 EDIT

我的代码似乎在chrome中带来了某种量子决斗状态,调用了一个宇宙,在这个宇宙中,函数被推到一个数组中时会变成
未定义的
。。。可怕的

我正在使用下面的代码构建一个函数数组,以便使用此函数回调将它们链接在一起

奇怪的是,尽管它看起来确实有效;所有具有正确参数的函数调用似乎都在发生,它也会在控制台中得到这些(使用我的格式和注释)

这似乎意味着,尽管它奏效了。。。它也不起作用。。。因为。。。新的_func在被推送到数组时变为未定义

WTF

有人知道这里会发生什么吗

我用的是ChromeV21

EDIT:fyi@idb.load_s3函数在作用域中,我知道它正在工作,因为它从indexedDB加载数据,而indexedDB在任何部分损坏时都不会加载数据(并且因为回调确实启动)

EDIT2:这是javascript,没有什么不同或奇怪的地方,只是更难阅读

var id, ids, new_func, ssid, stack,
  _this = this;

console.log("creating stack");

ids = (function() {
  var _results;
  _results = [];
  for (id in this.s3) {
    _results.push(id);
  }
  return _results;
}).call(this);

stack = [callback];

console.log(stack);

for (ssid in this.s3) {
  new_func = (function(cb) {
    return _this.idb.load_s3(ssids.shift(), cb);
  });
  console.log(new_func);
  stack.push(new_func);
  console.log(stack);
}

console.log("stack done");

编辑3:刚刚意识到问题的一部分是因为Chrome的控制台可能是异步的,所以在调用console.log之后,但在console.log实际输出数组内容之前,似乎最后一项从堆栈中弹出(代码中未显示)!!!因此,当我不调用函数(参见参考的gist)来执行堆栈时,其余的似乎工作正常

然而,这并不能解决异常的奥秘,异常抱怨undefined不是一个函数(就像它试图从数组中弹出undefined并执行它)。。。还是很奇怪

编辑#4: load_s3功能如下:
这里被质疑的代码的真实版本在load#u everything at#L145

的同一个文件中,我已经解决了!这个问题有两个部分看起来是一样的。首先,与edit3中一样,数组在推送函数的地方似乎包含一个未定义的项。然而,这似乎是chrome异步控制台中的一个怪癖(bug?),在调用console.log和实际记录阵列之间的时间内,该函数从阵列中删除

问题的第二部分在外观上也是欺骗性的,很抱歉,我在问问题时没有想到这一点如此重要。在linked(现在已经修改)中,函数试图从数组中弹出并执行一个额外的函数,这当然相当于尝试所有未定义的函数。不是一个容易发现的


一切都很好。谢谢你玩;)

查看生成的JavaScript可能会有很大帮助。啊-我想知道coffeescript是否将对“new_func”的引用视为调用函数的请求…@Pointy-添加了代码。你能提供一个问题的函数示例吗?我们不知道什么是
@s3
@idb
加载s3
回调
SSID
。。。这并不奇怪,这就是javascript闭包的工作原理。。。
> creating stack

# callback added to array correctly
> [function () { return _this.start(true); }]

# function generated correctly
> function (cb) { return _this.idb.load_s3(ssids.shift(), cb); } 

# but the function doesn't get added to the array !!!!!!!
> [function () { return _this.start(true); }, undefined × 1]

> stack done

# and the undefined from the array can't be executed of course, verified my line number
> Uncaught TypeError: undefined is not a function 
var id, ids, new_func, ssid, stack,
  _this = this;

console.log("creating stack");

ids = (function() {
  var _results;
  _results = [];
  for (id in this.s3) {
    _results.push(id);
  }
  return _results;
}).call(this);

stack = [callback];

console.log(stack);

for (ssid in this.s3) {
  new_func = (function(cb) {
    return _this.idb.load_s3(ssids.shift(), cb);
  });
  console.log(new_func);
  stack.push(new_func);
  console.log(stack);
}

console.log("stack done");