如何`arguments.callee`指匿名函数?(How does `arguments.cal

2019-09-22 14:05发布

需要一个脚本来很快告诉我有多少HTML注释有页面,其内容是什么的。 使用匿名函数递归遍历DOM似乎是适当的:

var comments = []; //set up an array where comment contents will be copied to

(function(D) {
  if (8===D.nodeType) comments.push(D.nodeValue); //check if node is a comment
  D=D.firstChild;
  while (D) {
    arguments.callee(D); //recursively look for comments...
    D=D.nextSibling; //...and remember to iterate over all children of any node
  }
})(document);

console.log(comments.join("\r\n")); //list all comments

小提琴按预期工作,但我很好奇,如果它被称为遍地真的是同样的功能,或在那里的原有功能的多个引用调用,或者是所谓的有多个相同的功能。毕竟,一直没有命名参考做,所以它怎么会为穿越的不断深入工作? 我想我或许可以通过增加检查下面的代码到while (D) {...}

//tmpCallee has been declared
if (tmpCallee) {
  console.warn(arguments.callee === tmpCallee);//true
  /*great, means these should be both pointing to the same function*/
  console.log(arguments.callee === arguments.caller);//false
  /*wait, what? didn't we just establish above that 
    all of our functions called recursively would be the same?*/
  console.log(arguments.caller);//undefined... but it was called recursively!
  console.log(arguments.callee);//prints our function code verbatim as it should
}
tmpCallee = arguments.callee;

我糊涂了。 1)我真的遍地调用同一个功能还是有所谓的多个相同的功能或者是别的东西在作怪? 2)为什么arguments.caller 不是我们的功能点? 它显然受到它调用 - 这就是递归是如何工作的,不是吗?

Answer 1:

我真的遍地调用同一个功能还是有所谓的多个相同的功能或者是别的东西在作怪?

是的,你只有一个功能实例,你指的是所有的时间。 但是,您要设置调用堆栈中的局部变量(在你的情况的说法D )将被保存以供每次调用。

为什么不包含arguments.caller在我们的功能点?

没有caller的属性arguments对象时,它被删除 。 你可能意味着caller属性的功能对象,这是不规范的,但仍然可用(虽然严格模式以及禁止的argments.callee )。



Answer 2:

只有一种这里涉及到的功能实例。 该函数递归调用本身。 您可以轻松地在你的代码的函数表达式分配一个名称检查:

(function fn (D) {

然后,身体内部:

fn === arguments.callee // => true

以上将是真正的每次调用,显示只有一个功能是创建,并在此过程中调用。

此外,这样的:

arguments.callee === arguments.callee.caller // => true, except first time

显示了该函数调用本身,即主叫方是被叫方。 上述表达式为真对于每次调用时,除了第一个中,由于在第一次调用从全局代码发生。

现场演示: http://jsfiddle.net/HbThh/2/



Answer 3:

没有caller的属性arguments ,你应该使用arguments.callee.callercaller



文章来源: How does `arguments.callee` refer to anonymous functions?