2010-12-28 11 views
31

Quando uso l'ultima (1.0) rilascio di CoffeeScript, una semplice uscita javascript simile a questa (per impostazione predefinita):Perché utilizzare la funzione wrapper javascript (aggiunto in CoffeeScript) ".Call (questo)"

(function() { 
    var a; 
    a = 1; 
}).call(this); 

Che cosa fa .call (this) fare e quale sarebbe il motivo per aggiungerlo?

+0

puoi anche mostrarci il codice che produce questo js? –

+1

La mia ipotesi è che è il modo più semplice per rendere tutte le variabili con scope locale (non globale) di default e per dare accesso all'ambito genitore attraverso 'this' – miensol

+2

Questo è un eccellente articolo sul tema del namespace JS: http: //javascriptweblog.wordpress.com/2010/12/07/namespacing-in-javascript/ –

risposta

15

Sta creando una funzione e quindi si chiama con l'ambito funzione/oggetto genitore.

.call e .apply sono diversi metodi di richiamo di una funzione. Fondamentalmente hai creato una funzione che non fa altro che impostare a = 1 all'interno del proprio ambito.

In javascript è necessario rendersi conto che ogni funzione è un oggetto e this è ciò che si riferisce all'oggetto/funzione corrente. L'utilizzo di .call(this) esegue l'override di this dall'interno della funzione e lo sostituisce con quello del contesto di chiamata.

33

È un modo per assicurarsi che il CoffeeScript compilato abbia il proprio ambito per i nomi delle variabili. Ciò ha benefici in termini di efficienza e semplicità (sai che il codice JavaScript generato non calpesterà le variabili utilizzate da altri codici). È possibile disabilitarlo con l'opzione --bare (o -b) nel compilatore CoffeeScript.

La ragione per la call(this) è solo per garantire che il CoffeeScript ha la stessa this come ambito in cui è collocato, in quanto le funzioni normalmente non ereditano oggetto this dal contesto circostante.

+5

Come è diverso da un auto exec funct? Ad esempio: (function() { /* Codice */ })(); – qwertymk

+8

La funzione autoeseguente perde la nozione di 'this', quando non viene caricata in un contesto del browser. Alcune piattaforme CommonJS valutano i file caricati con uno specifico 'this'. – jashkenas

+2

Capisco perfettamente le ragioni dell'ambito variabile, ma sono curioso di sapere come esista un vantaggio in termini di efficienza. Ti riferisci all'efficienza del compilatore o del JavaScript generato? –

Problemi correlati