【问题标题】:Maximum call stack size exceeded on SetTimeout recursive function (Javascript) [duplicate]SetTimeout递归函数(Javascript)超过最大调用堆栈大小[重复]
【发布时间】:2017-04-16 06:00:57
【问题描述】:

我有一个递归 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");
    }
}

但是,当过滤器需要很长时间才能加载时,我会收到“Uncaught RangeError: Maximum call stack size exceeded(...)”

如何防止这种情况并确保它一直运行到完成?

【问题讨论】:

    标签: javascript jquery recursion settimeout


    【解决方案1】:

    问题出在这里:

      setTimeout($scope.clickFilter(), 1000); 
    

    () 放在函数引用之后意味着您希望在代码中的该点立即调用该函数。你可能想要的是这样的:

      setTimeout($scope.clickFilter.bind($scope), 1000);
    

    • 根据需要将函数引用传递给setTimeout(),并且
    • 确保使用正确的this 值调用函数(.bind() 部分的作用)

    一旦你让它工作起来,“递归”这个词就不太合适了。是的,该函数在计时器到期后安排调用时正在引用自己,但它不是直接调用自己;它要求其他东西(计时器机制)稍后调用它。

    【讨论】:

    • 知道这是重复的... :-)
    • @T.J.Crowder 早上有时我无法处理奇怪的 SO 搜索。是的,这当然是一个骗局。
    猜你喜欢
    • 2012-03-18
    • 2014-01-18
    • 1970-01-01
    • 1970-01-01
    • 2020-07-10
    • 2014-08-03
    • 2018-03-02
    • 2021-07-24
    • 1970-01-01
    相关资源
    最近更新 更多