2

我想在javascript中退出我当前的调用堆栈,以免爆炸调用堆栈大小,但我无权访问setTimeout()调用,即:

setTimeout我的环境中不存在该功能:)

当我达到调用堆栈大小限制时,我仍然需要退出当前调用堆栈。

环境是“parse.com”和 CloudCode 模块,如果有人知道背后运行的是什么,那也有帮助!

有什么猜测吗?

PS:这并不是因为您唯一知道的就是网络浏览器环境和 DOM 节点操作,或者更糟糕的 Javascript,您需要 -1 这个问题,这个问题真的很中肯。并非每个功能都在任何地方实现。PS2:没有附加源代码,因为它更像是一个理论问题而不是应用问题!

4

2 回答 2

3

Javascript 支持抛出异常对象(实际上可以是任何东西),它可以尽可能多地退出调用堆栈。这个 MDN 页面可能有一些用处:

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Statements/try...catch

于 2012-11-30T00:25:19.423 回答
0

基于 JayC 的回答,您可以保留要调用的函数队列,并循环运行它们。您将在循环中捕获“退出调用堆栈”异常并运行下一个函数。

nextTick函数会将其参数附加到队列中。

var queue = [];

function nextTick(f) {
    queue.push(f);
}

while (queue.length > 0) {
    try {
        var fun = queue.shift();
        fun();
    }
    catch (ex) {
        if (ex !== 'exit callstack') {
            // Handle "real" exceptions here
        }
    }
}

我还没有测试过代码,但这个想法应该可行。当然,一个警告是您不能在异步函数中使用异常处理(除非您检查并重新抛出“退出调用堆栈”异常)。

于 2012-11-30T00:56:14.767 回答