2012-01-25 14 views
5

オブジェクトリテラルからメソッドを再帰的に呼び出すことはできますか?例えばJavaScriptオブジェクトリテラルメソッド:再帰呼び出し

(function() { 
    'use strict'; 
    var abc = ['A', 'B', 'C'], 
     obj = { 
      f: function() { 
       if (abc.length) { 
        abc.shift(); 
        f(); // Recursive call 
       } 
      } 
     }; 

    obj.f(); 
}()); 

エラー: 'F' が定義される前に使用されました。

ありがとうございました。

答えて

1

fという変数は、コードのどこにでも定義されていません。 obj.f()(またはthis.f)を使用して、thisがどこにあるべきかを知っている場合。

3

fは、メソッドのオブジェクトです。その結果、あなたがfにいるときは、fが添付されたオブジェクトがthisになります。あなたのようobj.f();

somethinigない場合:fはメソッドとして呼び出されたのであれば、再帰的に、fを呼び出すだけでfの内側に注意してくださいthis.f()

f: function() { 
    if (abc.length) { 
     abc.shift(); 
     this.f(); // Recursive call 
    } 
} 

を使用するために、thisは、現在のオブジェクトになります:obj.f.call(lala);の場合、thislalaになります。そして、あなたが何かやる場合:今

var func = obj.f; 
func(); 

thisを(strictモードでは未定義)fの内部でグローバルオブジェクトである

+0

'this'は' f'の方法によっては 'obj'を指しても指していなくてもよいが呼び出されます。後でその人に噛まれる前に、このことを明確にすること。 –

+0

@MattiVirkkunen - 実際に編集されました。ヒントをありがとう、あなたの新しいバッジをお楽しみください:) –

+0

Yay [!](http://stackoverflow.com/questions/9006587/javascript-obitest-literal-method-recursive-call) –

10

することができます、という名前の関数式使用して:

 f: function myself() { 
      if (abc.length) { 
       abc.shift(); 
       myself(); // Recursive call 
      } 
     } 

A読み込み:http://kangax.github.com/nfe/

+1

これは選択された回答にする必要があります。リンクありがとう。 – kliron

+0

それを命名関数にするのは、erorrを回避するものですか?独自のクロージャを作成しますか? –

関連する問題