我正在用 javascript 做一件非常简单的事情,基本上只有有时 javascript 会给我一个“递归太多”的错误。
有问题的代码:
if(pageLoad===undefined){
var pageLoad=function(){};
}
var pageLoad_uniqueid_11=pageLoad;
var pageLoad=function(){
pageLoad_uniqueid_11();
pageLoad_uniqueid_12();
};
var pageLoad_uniqueid_12=function(){
alert('pageLoad');
};
$(document).ready(function(){
pageLoad();
});
(是的,我知道有更好的方法来做到这一点。虽然这很难改变,尤其是因为未显示的 ASP.Net 部分回发)。
无论如何,当发生太多递归错误时,它会继续发生,直到我重新启动 Firefox。当我重新启动 Firefox 时,它又一切正常。我该如何解决?
我还制作了一个 jsbin example
更新
好的,我已经找到了如何在我们的代码中可靠地重现它,但它不适用于 jsbin 示例。如果我创建一个新选项卡并转到同一页面(有两个具有相同地址的选项卡),然后刷新第一个选项卡两次 次,那么我会一直收到此错误。我们没有使用任何类型的 session 或我能想到的任何其他可能导致此类问题只发生在一个选项卡中的东西!
更新 2 没有我想象的那么可靠,但它肯定只在打开同一页面的多个选项卡时才会发生。它会在打开的选项卡之一的每几次重新加载中发生
我还更新了我的代码以在 pageLoad(if 语句)最初未定义和最初定义时显示警报。不知何故,两个警报都出现了。此代码不会在呈现的页面中重复,并且不可能被调用两次。它位于顶级脚本元素中,没有被函数或任何东西包围!我的代码最终看起来像
if(pageLoad===undefined){
var pageLoad=function(){};
alert('new');
} else {
alert('old');
}
最佳答案
有问题的代码 -- 自身 -- 永远不会导致无限递归问题 -- 没有函数语句,所有函数对象都急切地分配给变量。 (如果 pageload
首先未定义,它将被分配一个 No-Operation 函数,请参阅下一节。)
我怀疑还有其他代码/事件触发了该行为。 可能导致的一件事是,如果脚本/代码在页面生命周期内被触发两次。第二次pageload
不会undefined,会保持原来的值,如果是调用另外两个函数的函数,会导致无限递归。
我会建议清理该方法 - 任何由并发症引起的问题都会消失 ;-) 期望的意图是什么?
快乐编码。
关于javascript - Firefox 中有时出现 "too much recursion"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6879238/