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

为什么使用JavaScript arguments.callee会导致RangeError,javascript,Javascript,下面的代码抛出了一个“UncaughtRangeError:超出了最大调用堆栈”,我不知道为什么。我认为这将是一系列事件: 代码在页面加载时运行 超时回调已设置 调用堆栈到此结束 5秒后,调用该函数 将再次设置超时回调 调用堆栈结束 等等 但我得到的控制台输出是: xi=0 Uncaught RangeError: Maximum call stack size exceeded 守则: <script> var xi = 0; (function(){

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

代码在页面加载时运行

超时回调已设置

调用堆栈到此结束

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>

Va=席=0;
(功能(){
window.console&&console.log(“xi=“+xi++”);
setTimeout(函数(){
参数。被调用方();
}, 5000);
})();

谢谢您的帮助。

您最好只使用命名函数

var xi = 0;
(function namedFunction (){
    window.console && console.log("xi=" +xi++);
    setTimeout(function(){
      namedFunction();
    }, 5000);
})();
如果经常创建间隔(希望立即运行),也可以创建一个helper函数


最好只使用命名函数

var xi = 0;
(function namedFunction (){
    window.console && console.log("xi=" +xi++);
    setTimeout(function(){
      namedFunction();
    }, 5000);
})();
如果经常创建间隔(希望立即运行),也可以创建一个helper函数


最好只使用命名函数

var xi = 0;
(function namedFunction (){
    window.console && console.log("xi=" +xi++);
    setTimeout(function(){
      namedFunction();
    }, 5000);
})();
如果经常创建间隔(希望立即运行),也可以创建一个helper函数


最好只使用命名函数

var xi = 0;
(function namedFunction (){
    window.console && console.log("xi=" +xi++);
    setTimeout(function(){
      namedFunction();
    }, 5000);
})();
如果经常创建间隔(希望立即运行),也可以创建一个helper函数

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

        setTimeout(function f(){
            f();
        }, 5000);
所以这会导致无休止的递归

你想要的是:

var xi = 0;
(function(){
    window.console && console.log("xi=" +xi++);
    var f = arguments.callee;
    setTimeout(function(){
        f();
    }, 5000);
})();
最里面的函数(匿名函数)正在调用自身。您的代码相当于

        setTimeout(function f(){
            f();
        }, 5000);
所以这会导致无休止的递归

你想要的是:

var xi = 0;
(function(){
    window.console && console.log("xi=" +xi++);
    var f = arguments.callee;
    setTimeout(function(){
        f();
    }, 5000);
})();
最里面的函数(匿名函数)正在调用自身。您的代码相当于

        setTimeout(function f(){
            f();
        }, 5000);
所以这会导致无休止的递归

你想要的是:

var xi = 0;
(function(){
    window.console && console.log("xi=" +xi++);
    var f = arguments.callee;
    setTimeout(function(){
        f();
    }, 5000);
})();
最里面的函数(匿名函数)正在调用自身。您的代码相当于

        setTimeout(function f(){
            f();
        }, 5000);
所以这会导致无休止的递归

你想要的是:

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


在ES5+严格模式下不可用。这将是一个适当更新代码的好机会。在ES5+严格模式下不可用。这将是一个适当更新代码的好机会。在ES5+严格模式下不可用。这将是一个适当更新代码的好机会。在ES5+严格模式下不可用。这将是一个适当更新代码的好机会。@Pumbaa80-谢谢。我知道我很傻,但那真的很傻!再次感谢。@Pumbaa80-谢谢。我知道我很傻,但那真的很傻!再次感谢。@Pumbaa80-谢谢。我知道我很傻,但那真的很傻!再次感谢。@Pumbaa80-谢谢。我知道我很傻,但那真的很傻!再次感谢。没错,但从技术上讲,这并不能回答问题(为什么?)@Pumbaa80这个问题无关紧要,因为我知道他想做什么,还有更好的办法。@Pumbaa80你错了。阅读此处:“答案可以是“不要那样做”,但也应该包括“试试这个”。任何让提问者朝着正确方向前进的答案都是有帮助的”“仔细阅读问题。具体来说,问题要求什么?确保你的答案提供了这一点——或者是一个可行的替代方案。”我提供了一个可行的替代方案,这是对的,但从技术上讲,它并不能回答问题(为什么?)@Pumbaa80这个问题无关紧要,因为我知道他想做什么,而且有更好的方法。@Pumbaa80你错了。阅读此处:“答案可以是“不要那样做”,但也应该包括“试试这个”。任何让提问者朝着正确方向前进的答案都是有帮助的”“仔细阅读问题。具体来说,问题要求什么?确保你的答案提供了这一点——或者是一个可行的替代方案。”我提供了一个可行的替代方案,这是对的,但从技术上讲,它并不能回答问题(为什么?)@Pumbaa80这个问题无关紧要,因为我知道他想做什么,而且有更好的方法。@Pumbaa80你错了。阅读此处:“答案可以是“不要那样做”,但也应该包括“试试这个”。任何让提问者朝着正确方向前进的答案都是有帮助的”“仔细阅读问题。具体来说,问题要求什么?确保你的答案提供了这一点——或者是一个可行的替代方案。”我提供了一个可行的替代方案,这是对的,但从技术上讲,它并不能回答问题(为什么?)@Pumbaa80这个问题无关紧要,因为我知道他想做什么,而且有更好的方法。@Pumbaa80你错了。阅读此处:“答案可以是“不要那样做”,但也应该包括“试试这个”。任何让提问者朝着正确方向前进的答案都是有帮助的”“仔细阅读问题。具体来说,问题要求什么?确保你的答案提供了这一点——或者是一个可行的替代方案。”我提供了一个可行的替代方案