var ninja = {
yell: function yell(n){
return n > 0 ? yell(n-1) + "a" : "hiy";
}
};
assert( ninja.yell(4) == "hiyaaaa", "Works as we would expect it to!" );
var samurai = { yell: ninja.yell };
var ninja = {};
assert( samurai.yell(4) == "hiyaaaa", "The method correctly calls itself." );
此代码块取自John Resig的JS tutorial。我想知道的是,他为什么要包括倒数第二行?那里忍者的目的是什么?
答案 0 :(得分:10)
本教程显示删除对象的引用不会删除对象本身。
包含函数ninja
的 yell
显示已删除对该函数的引用,而引用仍存在于另一个变量samurai
中。通过samurai
调用该函数,即使ninja
不再显示该函数,也会显示对象持久存在引用它们的变量之后不再这样做。
答案 1 :(得分:2)
这是为了证明即使ninja
对象不再被引用,你仍然可以调用它并且递归将起作用。
当然,我对该教程有两个主要问题。
您可以使用arguments.callee
来调用当前函数,而不必为函数本身命名。对匿名函数特别有用。在严格的模式下弃用,但问我是否给了老鼠的屁股。
无论如何你不需要递归这个函数:
return "hiy"+new Array(n+1).join("a");
答案 2 :(得分:0)
如果您注意到上一个代码:http://ejohn.org/apps/learn/#13
它表明一旦父对象被清除,匿名函数就会消失。
#14显示,如果给匿名函数一个名称,如果设置为另一个变量,它仍然可以引用它。