2009-12-03 21 views
6

Date un'occhiata al codice seguente:Passando un parametro come un puntatore in JavaScript

var o; 

(function (p) { 
    p = function() { 
     alert('test'); 
    }; 
})(o); 

o(); // Error: 'o is not a function' 

Nella funzione di cui sopra sto creando una funzione anonima che prende un parametro, che auto-invoca con creato in precedenza oggetto passato come parametro. Quindi sto puntando questo oggetto a una funzione (dall'interno del nuovo scope) e infine (cercando) di richiamarlo dall'esterno.

La mia domanda è, come posso passare quell'argomento 'per riferimento' come per cambiare il puntatore a cui punta?

risposta

12

È possibile ottenere l'effetto desiderato, approfittando del fatto che Javascript passa gli oggetti per riferimento:

var o = { }; 

(function (p) { 
    p.fn = function() { 
     alert('test'); 
    }; 
})(o); 

o.fn(); 
+6

In realtà, "passaggio per riferimento" è un po 'improprio in JavaScript. Rispetto ad altre lingue che hanno veri tipi di "riferimento", JavaScript non * passa nulla per riferimento. Passa sempre in base al valore. Quel valore potrebbe * contenere * un riferimento, che è ciò che penso tu stia cercando di dire. –

1

Quando si passa in o variabili nel tuo esempio, si sta passando un valore indefinito, non un riferimento a qualsiasi cosa. Quello che dovresti fare è inviare gli oggetti genitore. In questo caso, l'oggetto finestra (presumendo che tu stia utilizzando un browser).

(function (p, name) { 
    p[name] = function() { 
     alert('test'); 
    }; 
})(window, "o"); 
o(); 

Passa all'oggetto finestra e al nome della nuova funzione. Quindi assegna la tua funzione alla finestra, e ora è disponibile per essere chiamata. A meno che non si usino le chiusure, tuttavia, suggerirei di assegnare direttamente la funzione.

function o() { 
    alert('test'); 
}; 
o(); 
3

Sei meglio usare il linguaggio come previsto, piuttosto che cercare di piegarlo per adattarsi idiomi che hanno senso solo in una lingua costruita secondo un diverso insieme di principi.

var o = (function(p) { 
    return function() { 
     alert('test'); 
    }; 
})(); 

o(); 
+0

La ragione per cui userò l'idioma sopra è perché con questo, se voglio cambiare il nome dell'oggetto principale ('o'), devo solo cambiarlo dalla 1a riga (' var o; ') e dalla parte dove lo passo come parametro ('}) (o);'); Non ho bisogno di cambiare nulla dalla funzione anonima. –

Problemi correlati