变量的目的

时间:2013-06-07 14:12:49

标签: javascript

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

3 个答案:

答案 0 :(得分:10)

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

包含函数ninja

yell显示已删除对该函数的引用,而引用仍存在于另一个变量samurai中。通过samurai调用该函数,即使ninja不再显示该函数,也会显示对象持久存在引用它们的变量之后不再这样做。

答案 1 :(得分:2)

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

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

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

  2. 无论如何你不需要递归这个函数:

    return "hiy"+new Array(n+1).join("a");
    

答案 2 :(得分:0)

如果您注意到上一个代码:http://ejohn.org/apps/learn/#13

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

#14显示,如果给匿名函数一个名称,如果设置为另一个变量,它仍然可以引用它。