eval的结果(arguments.callee);

时间:2018-01-11 13:36:58

标签: javascript google-chrome-devtools eval

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

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

foo(  );

如果我将功能修改为:

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

foo();

输出:

Called

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

1 个答案:

答案 0 :(得分:5)

eval(arguments.callee)arguments.callee转换为字符串,它看起来非常类似于函数声明,然后计算该字符串 - 运行它,它只是评估函数声明,创建函数。

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

如果您执行了eval(arguments.callee)()(请注意最后的()), 会调用它(某种递归,技术上不同的功能是创建的,但是......)并最终导致堆栈溢出错误。

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