2009-07-07 18 views
8

Estoy teniendo un espacio de nombres JavaScript dicenMétodo de llamada dentro de otro método en javascript?

A={ 

    CA: function() { 
    this.B(); 
    }, 
    B: function() { 
    var test='test'; 
    var result='t1'; 

    C: function() { 
     this.test='test1'; 
     ..... 
     ..... 
     return 'test1';  
    } 

    result=this.C(); 
    return result; 
    } 
} 

ahora, cuando estoy ejecutores de dicho código que está dando que TypeError: this.C no es una función. ¿Puede alguien decirme por qué es así? Sé que es algo relacionado con el alcance léxico, pero no puedo entender esto.

+0

Disculpa, soy un nuevo usuario y publiqué la primera pregunta, no sé cómo publicar preguntas. Lo tendré en cuenta ahora en adelante. Gracias. –

Respuesta

5

Creo que el problema es que cuando this.C() se ejecuta dentro de la función a que se refiere por B, this se refiere al objeto que contiene B, es decir, objeto A. (Esto supone B() se llama en el contexto de A)

El problema es, C no existe en el objeto A, ya que está definido dentro de B. Si desea llamar a una función local C() dentro de B, simplemente use C().

EDITAR: Además, no estoy seguro de lo que ha publicado es JavaScript válido. Específicamente, B debe definirse de esta manera, ya que no puede usar el objeto: sintaxis de propiedad dentro de una función.

B: function() 
{ 
    var test='test'; 
    var result='t1'; 

    var C = function() 
    { 
    this.test='test1'; 
    return 'test1';  
    } 

result=C(); 
return result; 
} 
+0

Creo que estás en lo correcto y también hice lo mismo finalmente (hice la función y la llamé directamente desde la función externa) después de golpear mi cabeza para hacer que esto funcione. –

4

Estoy realmente sorprendido de que su código no le da error en la línea 'C:'.

De todos modos, su sintaxis para definir una función no es correcta. Defínalo usando la palabra clave var. Además, observe que creé el 'cierre' para que la función C pueda acceder a 'esto'. Ver el código de abajo:

A={ 

    CA: function() 
    { 
    this.B(); 
    }, 

    B: function() 
    { 
    var test='test'; 
    var result='t1'; 

    var self = this; 
    var C = function() 
      { 
       self.test='test1'; 
       ..... 
       ..... 
       return 'test1';  
      } 

    result=C(); 
    return result; 
    } 
} 

Si desea asignar C a 'este' objeto, también se puede hacer:

A={ 

    CA: function() 
    { 
    this.B(); 
    }, 

    B: function() 
    { 
    var test='test'; 
    var result='t1'; 

    var self = this; 
    this.C = function() 
      { 
       self.test='test1'; 
       ..... 
       ..... 
       return 'test1';  
      }; 

    result= this.C(); 
    return result; 
    } 
} 
+0

No podrá usar 'esto' porque 'esto' es una palabra clave y necesita crear el cierre. Además, como estoy definiendo el "yo" como una variable local, no afectará el objeto global. – SolutionYogi

+0

sí lo siento, me di cuenta de mi estupidez, y por lo tanto borré mi comentario :-(Pero sí, ahora estoy de acuerdo con tu respuesta. +1 por aguantarme también a mí :-) –

21

Hay que tener cuidado cuando se utiliza este para identificar cualquier cosa en Javascript porque cada vez que cambia el alcance "esto" cambia.

Asignar la referencia 'this' a su propia variable ayuda a evitar esto.

var a = new function() { 
    var self = this; 

    self.method = function() { alert('hiya'); }; 

    var b = function() { 
     this.method(); // this isn't 'a' anymore? 
     self.method(); // but 'self' is still referring to 'a' 
    }; 

}; 
+1

var self = this; es justo lo que estaba buscando! ¡Gracias! –

+0

Esto es exactamente lo que necesitaba, muchas gracias. –

0

Solución para los métodos de llamada de otro método. (Esencialmente el puntero "this" se debe asignar a una variable y la nueva variable utilizado en lugar de esto.)

function myfunction(){ 
    var me = this; 

    me.method1 = function(msg){ alert(msg); } 

    me.method2 = function(){ 
     me.method1("method1 called from method2"); 
    } 
} 

var f as new myfunction(); 
f.method2(); 

Este ejemplo muestra cómo se puede llamar a un método de dentro de otro método o desde el exterior con una instancia de la función.

Cuestiones relacionadas