2009-07-07 25 views
8

Sto avendo uno spazio dei nomi JavaScript diconoMetodo di chiamata all'interno di un altro metodo in 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; 
    } 
} 

Ora, quando sto eseguendo tale codice si sta dando che TypeError: this.C non è una funzione. Qualcuno può dirmi perché è così. So che è qualcosa di correlato con lo scope lessicale ma non riesco a capirlo.

+0

Siamo spiacenti, sono un nuovo utente e ho postato la prima domanda, non so come inviare domande. Terrò questo a mente ora in poi. Grazie. –

risposta

5

ritengo il problema è che quando this.C() viene eseguito all'interno della funzione a cui si riferisce B, this riferisce all'oggetto che contiene B, cioè oggetto A. (Ciò presuppone B() è chiamato nel contesto di A)

Il problema è, C non esiste sull'oggetto A, dal momento che è definito all'interno B. Se si desidera chiamare una funzione locale C() all'interno di B, utilizzare solo C().

MODIFICA: Inoltre, non sono sicuro che quello che hai pubblicato sia JavaScript valido. Nello specifico, B deve essere definito in questo modo, poiché non è possibile utilizzare l'oggetto: sintassi delle proprietà all'interno di una funzione.

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

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

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

Penso che tu abbia ragione e alla fine ho anche fatto la stessa cosa (ho fatto la funzione e l'ho chiamata direttamente dalla funzione esterna) dopo aver sbattuto la testa per farlo funzionare.C. –

4

Sono davvero sorpreso che il tuo codice non ti dia errore sulla riga 'C:'.

In ogni caso, la sintassi per definire una funzione non è corretta. Definirlo usando la parola chiave var. Inoltre, nota che ho creato la 'chiusura' in modo che la funzione C possa accedere a 'this'. Vedere il codice qui sotto:

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; 
    } 
} 

Se si desidera assegnare C a 'questo' oggetto, si può anche fare:

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

Non potrai utilizzare 'questo' perché 'questa' è una parola chiave e devi creare la chiusura. Inoltre, poiché sto definendo il "sé" come una variabile locale, non avrà alcun impatto sull'oggetto globale. – SolutionYogi

+0

si scusa, ho capito la mia stupidità, e quindi cancellato il mio commento :-(Ma sì, sono d'accordo con la tua risposta. +1 per sopportare anche me :-) –

21

Bisogna stare attenti quando si utilizza questo per identificare qualsiasi cosa in Javascript perché ogni volta che cambi l'ambito "questo" cambia.

Assegnare il riferimento "questo" alla propria variabile consente di aggirare questo problema.

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; è proprio quello che stavo cercando! Grazie! –

+0

Questo è esattamente ciò di cui avevo bisogno, molte grazie. –

0

Soluzione per chiamare i metodi da un altro metodo. (Essenzialmente il puntatore "this" deve essere assegnato ad una variabile e la nuova variabile utilizzata al posto di questo.)

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(); 

Questo esempio mostra come si può chiamare un metodo dall'interno di un altro metodo o dall'esterno utilizzando un'istanza della funzione.

Problemi correlati