-2
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 教程。我想知道的是,他为什么要包括倒数第二行?忍者在那里的目的是什么?

4

3 回答 3

10

本教程显示删除对对象的引用不会删除对象本身。

ninja其中包含一个函数yell显示已删除对该函数的引用,而该引用仍存在于不同的变量中,samurai. 调用该函数,samurai即使ninja不再有它表明对象在引用它们的变量之后仍然存在,不再这样做。

于 2013-06-07T14:16:03.270 回答
2

这是为了证明即使ninja不再引用该对象,您仍然可以调用它并且递归将起作用。

当然,该教程有两个主要问题。

  1. 您可以使用arguments.callee来调用当前函数,而不必为函数本身命名。对于匿名函数特别有用。在严格模式下已弃用,但问我是否给了老鼠的屁股。

  2. 无论如何,您不需要递归此函数:

    return "hiy"+new Array(n+1).join("a");
    
于 2013-06-07T14:16:35.970 回答
0

如果您注意到前面的代码:http ://ejohn.org/apps/learn/#13

它表明,一旦父对象被清除,匿名函数就会消失。

#14 表明,如果你给匿名函数一个名字,如果设置为另一个变量,它仍然可以引用它。

于 2013-06-07T14:20:09.940 回答