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)
输出只打印一次,所以发生了什么?
eval(arguments.callee)
转换arguments.callee
为字符串,这将看起来非常像你的函数声明,然后评估该字符串-这其实不运行它,它只是计算函数声明,创建一个函数.
您的toString
版本只是明确地执行了第一部分.
如果你这样做eval(arguments.callee)()
(注意()
最后),那就会调用它(有点递归,创建技术上不同的函数,但是......)并最终导致堆栈溢出错误.
请注意,arguments.callee
严格模式下不允许这样做.如果需要引用被调用的函数,请为其命名并使用名称.
归档时间: |
|
查看次数: |
42 次 |
最近记录: |