评估结果(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
在严格模式下是不允许的。如果需要引用被调用的函数,给它起个名字,用这个名字。
我只是 运行 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
在严格模式下是不允许的。如果需要引用被调用的函数,给它起个名字,用这个名字。