ページにある 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
Fiddleは期待どおりに動作しますが、本当に同じ関数が何度も呼び出されたのか、元の関数への複数の参照が呼び出されたのか、それとも同じ関数が複数呼び出されたのか、興味がありました...参照が行われたので、トラバーサルが深くなるにつれてどのように機能しますか? 次のコードを追加することで確認できると思いました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
ないのはなぜですか? それは明らかにそれによって呼び出されました-それが再帰の仕組みですよね?