eval的结果(arguments.callee);

Nat*_*ajC 1 javascript eval google-chrome-devtools

我刚刚在Chrome Developer Tool中运行了以下功能,但没有任何反应.那么正在发生什么 - 这将是一个无限循环?

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

foo(  );
Run Code Online (Sandbox Code Playgroud)

如果我将功能修改为:

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

foo();
Run Code Online (Sandbox Code Playgroud)

输出:

Called
Run Code Online (Sandbox Code Playgroud)

输出只打印一次,所以发生了什么?

T.J*_*der 5

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

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

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


请注意,arguments.callee严格模式下不允许这样做.如果需要引用被调用的函数,请为其命名并使用名称.