在SetTimeoutrecursion函数(Javascript)上超出最大调用堆栈大小
我有一个recursion的SetTimeout函数,它可以在筛选器加载后(在Ajax中加载,因此在页面加载时不能立即提供)点击我的页面上的筛选器。
$scope.clickFilter = function () { var filter = $('.filter-item') .find('input[value="' + $scope.activeFilter + '"]'); if (filter.length < 1) { setTimeout($scope.clickFilter(), 1000); } else { $(filter).trigger("click"); } }
但是,当filter需要很长时间才能加载时,出现“Uncaught RangeError:Maximum call stack size exceeded(…)”
我如何防止这种情况并确保它一直运行到完成?
问题在这里:
setTimeout($scope.clickFilter(), 1000);
在函数引用之后放置()
意味着您希望函数立即在代码中被调用 。 你可能想要的东西是这样的:
setTimeout($scope.clickFilter.bind($scope), 1000);
哪会
- 并根据需要传递函数引用
setTimeout()
- 确保该函数将被调用适当的
this
值(什么.bind()
部分)
一旦你得到它的工作,“recursion”这个词是不合适的。 是的,函数在定时器到期后安排通话时引用自身,但不直接调用自己; 它要求别的东西(定时器机制)稍后调用它。