2013-01-23 18 views
6

Ho un sacco di JavaScript dalla notte dei tempi, con chiamate di funzione scritte in questo modo:Patterns JavaScript: Contesto di Chiamata funzione

THING.someFunction.call(THING); 

Mi sembra che dovrebbero sempre essere equivalente a:

THING.someFunction(); 

Queste due chiamate sono sempre equivalenti? E le vecchie versioni di JavaScript?

Mi sembra che lo scopo del secondo THING in quella prima riga di codice sia quello di impostare il contesto (this) all'interno di someFunction. Ma il contesto all'interno di quella funzione dovrebbe già essere THING per impostazione predefinita, giusto?

Giusto per essere chiari, THING si definisce qualcosa di simile:

var THING = function() { 
    // private vars 

    return{ 
     // code 
     someFunction : function() { 
      // code 
     } 
    }; 
}(); 
+2

Ora che hai il tuo codice, 'THING.someFunction' è' indefinito'. – gilly3

+1

Credo che manchino le parentesi alla fine della dichiarazione di THING, ad es. COSA = function {}(); –

risposta

1

Sì, sono equivalenti. E non conosco nessuna versione di JavaScript in cui non fossero (tuttavia, call sembra essere stato aggiunto in 1.3).

+1

Perché il downvote? – Bergi

+0

Alla fine ho capito che avrei potuto verificare la verità della mia ipotesi usando Firebug. Hai ragione. E dal momento che hai risposto per primo, ti darò la vittoria. Saluti. – theJollySin

0

Sono gli stessi tecnicamente. Ma si comportano anche in modo leggermente diverso nella programmazione asincrona. call() viene utilizzato per chiamare una funzione passando un ambito come parametro. Ciò fornisce un modo conveniente per chiamare funzioni definite in callback ed esecuzione ritardata (setTimeout, setInterval). Se hai usato una qualsiasi delle librerie JS, avresti notato $ .proxy, o _.bind, questi sono alias che implementano la chiamata (scope);

Vedere this MDN doc per ulteriori informazioni.

+2

Perché il downvote? Puoi per favore indicare cosa non era corretto in quello che ho affermato? Mi piacerebbe correggermi se ho capito qualcosa di sbagliato, per lo meno. – praneetloke

+1

Non ho fatto downvoting, ma 'call' non imposta scope. – nnnnnn

+0

Hai letto il documento MDN nella mia risposta? Il primo argomento in call() è 'thisArg' che può essere impostato su qualsiasi oggetto che rappresenta scope (contesto). – praneetloke

Problemi correlati