我刚刚在Chrome Developer Tool中运行了以下功能,但没有任何反应。那么发生了什么 - 这将是一个无限循环?
function foo() {
eval( arguments.callee );
}
foo( );
如果我将功能修改为:
function foo() {
console.log('Called');
eval( arguments.callee.toString() );
}
foo();
输出:
Called
输出只打印一次,所以发生了什么?
答案 0 :(得分:5)
eval(arguments.callee)
将arguments.callee
转换为字符串,它看起来非常类似于函数声明,然后计算该字符串 - 不运行它,它只是评估函数声明,创建函数。
您的toString
版本只是明确地执行了第一部分。
如果您执行了eval(arguments.callee)()
(请注意最后的()
), 会调用它(某种递归,技术上不同的功能是创建的,但是......)并最终导致堆栈溢出错误。
请注意,严格模式下不允许使用arguments.callee
。如果需要引用被调用的函数,请为其命名并使用名称。