需要一个脚本来快速告诉我页面上有多少 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
指向我们的函数?它显然是由它调用的——这就是递归的工作原理,不是吗?