-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 チュートリアルから取得したものです。私が疑問に思っているのは、なぜ彼は最後から 2 番目の行を含めたのですか? そこでの忍者の目的とは?

4

3 に答える 3

10

チュートリアルは、オブジェクトへの参照を削除してもオブジェクト自体は削除されないことを示しています。

ninja関数を含む は、yellその関数への参照が削除されていることが示されていますが、参照は別の変数にまだ存在していますsamuraisamurai関数がなくても関数を呼び出すと、ninjaオブジェクトが参照している変数を超えて存続し、もはやそうしていないことが示されます。

于 2013-06-07T14:16:03.270 に答える
2

ninjaオブジェクトが参照されなくなったとしても、それを呼び出すことができ、再帰が機能することを示すためです。

もちろん、このチュートリアルには 2 つの大きな問題があります。

  1. arguments.callee関数自体に名前を付ける代わりに、現在の関数を呼び出すために使用できます。無名関数に特に役立ちます。厳密なモードでは非推奨ですが、ネズミのお尻を与えるかどうか尋ねてください。

  2. とにかく、この関数の再帰は必要ありません:

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