2012-01-25 27 views
5

¿Es posible llamar recursivamente un método desde un objeto literal?JavaScript Método literal del objeto: llamada recursiva

Por ejemplo:

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

    obj.f(); 
}()); 

Error: 'f' fue utilizado antes se ha definido.

Gracias.

Respuesta

1

No hay ninguna variable llamada f definida en ninguna parte de su código. Use obj.f() (o this.f si conoce this puntos a donde debería).

3

f es un método en su objeto. Como resultado, cuando esté en f, this será el objeto al que se adjunta f. Así que para llamar de forma recursiva f, utilice this.f()

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

Ten en cuenta que en el interior de f, this sólo será el objeto actual si f se invoca como método: obj.f();

Si somethinig como : obj.f.call(lala);, luego this ahora será lala. Y si haces algo como:

var func = obj.f; 
func(); 

Ahora this es el objeto global dentro de f (o no definido en modo estricto)

+0

'this' puede o no apuntar a' obj' según cómo 'f' se llama. Mejor aclarar esto antes de morder al tipo más tarde. –

+0

@MattiVirkkunen - de hecho - editado. Gracias por la sugerencia, y disfruta de tus nuevas insignias :) –

+0

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

10

Usted puede, mediante el uso de un nombre de expresión función:

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

A debe leer: http://kangax.github.com/nfe/

+1

Esta debería ser la respuesta elegida. Gracias por el enlace también. – kliron

+0

¿Qué hace exactamente que al ser una función nombrada evite el error? Crear su propio cierre? –

Cuestiones relacionadas