Javascript 评估结果(arguments.callee);

Javascript 评估结果(arguments.callee);,javascript,google-chrome-devtools,eval,Javascript,Google Chrome Devtools,Eval,我刚刚在Chrome开发者工具中运行了下面的函数,但什么也没发生。那么现在发生了什么——这将是一个无限循环吗 function foo() { eval( arguments.callee ); } foo( ); 如果我将函数修改为以下内容: function foo() { console.log('Called'); eval( arguments.callee.toString() ); } foo(); 输出: Called 输出只打印一次,所以发生

我刚刚在Chrome开发者工具中运行了下面的函数,但什么也没发生。那么现在发生了什么——这将是一个无限循环吗

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

foo(  );
如果我将函数修改为以下内容:

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

foo();
输出:

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

evalarguments.callee将arguments.callee转换为字符串,它看起来非常像您的函数声明,然后计算该字符串-该字符串不运行它,它只计算函数声明,创建一个函数

您的toString版本只显式地执行第一部分

如果您在最后做了evalarguments.callee注释,这将递归地调用它,创建了技术上不同的函数,但是。。。并最终导致堆栈溢出错误

请注意,在严格模式下不允许arguments.callee。如果需要引用正在调用的函数,请为其指定一个名称并使用该名称。

evalarguments.callee将arguments.callee转换为字符串,该字符串与函数声明非常相似,然后对该字符串求值-该字符串不运行它,它只对函数声明求值,创建一个函数

您的toString版本只显式地执行第一部分

如果您在最后做了evalarguments.callee注释,这将递归地调用它,创建了技术上不同的函数,但是。。。并最终导致堆栈溢出错误


请注意,在严格模式下不允许arguments.callee。如果您需要引用正在调用的函数,请给它一个名称并使用该名称。

eval将实例化一个与foo完全相似的函数,但它不会调用该函数。确实,谢谢,我错过了这一重要事实。eval将实例化一个与foo完全相似的函数,但它不会调用该函数。确实,谢谢,我错过了这个重要的事实。哇,那确实很快,谢谢,我错过了“eval只是评估函数声明,创建函数”的部分,我会接受你的回答。哇,那确实很快,谢谢,我错过了“eval只是评估函数声明,创建函数”的部分,我会接受你的回答。