为什么使用JavaScript arguments.callee会导致RangeError

时间:2014-02-18 07:04:36

标签: javascript

下面的代码抛出“未捕获的RangeError:超出最大调用堆栈”,我不知道为什么。我认为这将是一系列事件:

代码在页面加载

上运行

设置超时回调

调用堆栈在那里结束

5秒后,该函数被称为

再次设置超时回调

并且调用堆栈结束

但我获得的控制台输出是:

xi=0
Uncaught RangeError: Maximum call stack size exceeded

代码:

<script>
    var xi = 0;
    (function(){
        window.console && console.log("xi=" +xi++);
        setTimeout(function(){
            arguments.callee();
        }, 5000);
    })();
</script>

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

最里面的函数(匿名函数)正在调用自身。您的代码等同于

        setTimeout(function f(){
            f();
        }, 5000);

因此,这会导致无休止的递归。

你想要的是:

var xi = 0;
(function(){
    window.console && console.log("xi=" +xi++);
    var f = arguments.callee;
    setTimeout(function(){
        f();
    }, 5000);
})();

答案 1 :(得分:0)

你最好只使用一个命名函数。

var xi = 0;
(function namedFunction (){
    window.console && console.log("xi=" +xi++);
    setTimeout(function(){
      namedFunction();
    }, 5000);
})();

如果您经常创建间隔(您希望立即运行),也可以创建辅助函数。

var xi = 0;

function newInterval (duration, callback) {
    if (typeof callback !== 'function') return console.error('newInterval() requires a function');
    callback();
    return setInterval(callback, duration);
}

var intervalID = newInterval(5000, function () {
    console.log('xi=' + xi++);
});

Here's the jsfiddle to try it.