2010-04-18 7 views
11

Ho il seguente codice JavascriptCome chiamo le funzioni di un oggetto all'interno dello stesso oggetto?

add_num = { 
    f: function(html, num) { 
    alert(this.page); 
    }, 

    page : function() { 
    return parseInt(this.gup('page')); 
    }, 

    gup : function(name) { 
    name = name.replace(/[\[]/,'\\\[').replace(/[\]]/,'\\\]'); 
    var regex = new RegExp('[\\?&]'+name+'=([^&#]*)'); 
    var results = regex.exec(window.location.href); 
    if(results == null) 
     return ''; 
    else 
     return results[1]; 
    } 
} 

Ma quando chiamo add_num.f() quello che ottengo da alert() è il codice effettivo della pagina. Cioè, restituisce

function() { 
    return parseInt(this.gup('page')); 
    } 

Mi aspettavo un valore numerico e non alcun codice.

+0

In realtà non si sta * chiamando * la funzione, ma è sufficiente passarla come oggetto a 'alert()'. Prova 'alert (this.page());'. –

risposta

8

Ecco perché è necessario chiamare la funzione page:

alert(this.page()); 

invece di

alert(this.page); 
4

Si sta allertando la funzione stessa, non il risultato dell'esecuzione. Si dovrebbe fare questo:

alert(this.page()); 
3

La ragione è che un letterale non è una funzione, quindi non ha un costruttore (visibile) così 'questo' si riferirà all'oggetto chiamante.

Ovviamente, questo non è vero se si assegna questo letterale al prototipo di una funzione, ma suppongo che questo non sia il caso qui.

Inoltre, Darin è corretto, si sta restituendo la funzione, non eseguendola.

Basta fare riferimento all'oggetto in modo esplicito, ad es. add_num.page().

add_num = { 
    f: function(html, num) { 
    alert(add_num.page()); 
    }, 

    page : function() { 
    return parseInt(add_num.gup('page')); 
    }, 

    gup : function(name) { 
    name = name.replace(/[\[]/,'\\\[').replace(/[\]]/,'\\\]'); 
    var regex = new RegExp('[\\?&]'+name+'=([^&#]*)'); 
    var results = regex.exec(window.location.href); 
    if(results == null) 
     return ''; 
    else 
     return results[1]; 
    } 
} 
+0

E 'una cattiva pratica usare 'this' over chiamando l'oggetto esplicitamente? – Blexy

Problemi correlati