在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”这个词是不合适的。 是的,函数在定时器到期后安排通话时引用自身,但不直接调用自己; 它要求别的东西(定时器机制)稍后调用它。