递归javascript超过调用堆栈大小

时间:2014-02-28 15:07:58

标签: javascript angularjs

我正在写一个angularjs控制器,它正在轮询东西。轮询函数调用自身超时。以下是两个例子。第一个超出调用堆栈大小,但第二个示例没有。这是为什么?

示例1(超过调用堆栈大小):

myApp.controller('Ctrl1', function($scope, $timeout) {
   $scope.value = 1;
    function poll() {
        $scope.value++;
        $timeout(poll(), 1000);
    }
   poll();
});

示例2(工作正常):

myApp.controller('Ctrl1', function($scope, $timeout) {
   $scope.value = 1;
    function poll(){
        $timeout(function() {
            $scope.value++;
            poll();
        }, 1000);
    };     
   poll();
});

2 个答案:

答案 0 :(得分:6)

您没有传递函数,而是传递了返回值(undefined)。这意味着你立即调用它,因为它自称,好吧,这是你的堆栈溢出。

更改

$timeout(poll(), 1000);

$timeout(poll, 1000);

顺便说一下,你可以重写

function poll() {
    $scope.value++;
    $timeout(poll, 1000);
}
poll();

以稍微优雅的方式,不污染外部范围:

(function poll() {
    $scope.value++;
    $timeout(poll, 1000);
})();

答案 1 :(得分:0)

将函数放在$ timeout():Sou使它像:

$timeout(function(){

   pool();
   // You can also add some other things here...

}, 1000):