评估结果(arguments.callee);

Result of eval( arguments.callee );

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

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

foo(  );

如果我将函数修改为以下:

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

foo();

输出:

Called

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

eval(arguments.callee)arguments.callee 转换为字符串,这看起来非常像您的函数声明,然后评估该字符串 - not 运行 它,它只是评估函数声明,创建一个函数。

您的 toString 版本只是明确地完成了第一部分。

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


请注意 arguments.callee 在严格模式下是不允许的。如果需要引用被调用的函数,给它起个名字,用这个名字。