RangeError:超出最大调用堆栈大小

thr*_*rag 20 angularjs

我想这意味着有一个循环引用,但对于我的生活,我无法猜测如何解决它.

有人有主意吗?

http://plnkr.co/edit/aNcBcU?p=preview

检查Chrome中的调试控制台(例如),您将看到错误.违规行是

 scope.map = map;
Run Code Online (Sandbox Code Playgroud)

scope.map正在控制器上"监视"

$scope.$watch("options.map", function (map) { ... }, true);
Run Code Online (Sandbox Code Playgroud)

Roy*_*els 18

这是因为你要比较对象的平等而不是参考.将您的$watch陈述改为:

$scope.$watch("options.map", function (map) {
    if (map === undefined) {
        alert("map has no value");
    } else {
        alert("map is defined");
    }
});
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!仅适用于可能需要此答案的其他人.我想这个失败的原因是被测试的对象是一个具有许多深度嵌套属性的对象?为什么此对象上的测试相等导致超出堆栈大小的消息? (10认同)

Mar*_*rta 9

我也有这个问题,发现我比较的对象有循环引用.(试过JSON.stringify()把'TypeError:将循环结构转换为JSON').

当我编辑我的对象以使其没有圆形结构时,我修复了这个问题,并且不是通过引用而是通过属性值来比较对象,这是我需要的.


les*_*ome 6

$ watch函数的第三个参数告诉我们如何比较观察对象.仅参考比较错误.递归平等比较,如果一个对象包含循环引用,然后用最大堆栈大小.例如:

var a = {ref:b};
var b = {ref:a};
$scope.$watch('b', function(){
  //code here will never called, because stack overflow when comparing the object b. 
}, true)
Run Code Online (Sandbox Code Playgroud)