我只是在Chrome开发者工具中运行了以下功能,但没有任何反应。那么发生了什么-这将是一个无限循环吗?

function foo() {
    eval( arguments.callee );
}

foo(  );


如果我将功能修改为以下内容:

function foo() {
    console.log('Called');
    eval( arguments.callee.toString() );
}

foo();


输出:

Called


输出仅打印一次,这是怎么回事?

最佳答案

eval(arguments.callee)arguments.callee转换为字符串,该字符串看起来非常类似于您的函数声明,然后评估该字符串。该字符串不运行,它仅评估函数声明,创建一个函数。

您的toString版本只是明确地执行第一部分。

如果您做了eval(arguments.callee)()(最后请注意()),则会调用它(递归地创建了技术上不同的函数,但是...)并最终导致堆栈溢出错误。



请注意,严格模式下不允许使用arguments.callee。如果需要引用被调用的函数,请给它命名并使用该名称。

关于javascript - eval(arguments.callee);的结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48208399/

10-12 00:09