Newsgroup: it.comp.lang.javascript
Titolo: Parametri by ref

E' possibile dichiarare una funzione JS
con parametri passati per *reference*
e non per valore?
grazie in anticipo
Giuseppe
mail:  
fio...@libero.it

 ha scritto nel messaggio
news:95be8g$5a7u$1...@stargate1.inet.it...

cioè???????
andreotta fabiano
 WebMªster ATI POWER s.n.c.
 
andr...@atipower.it
 
http://www.atipower.it
    -new-
 
http://www.aticommerce.com
 
http://www.afdsoftware.freeweb.org
 
http://www.jsdir.com

e non per valore?
i valori vengono SEMPRE passati per referenza, che io sappia, dal 
momento che tutte le variabili sono oggetti (quindi, ancora meglio, i 
valori vengono passati per *puntatore*)
per "sganciare" un oggetto da una sua copia, devi creare un oggetto 
vuoto e copiarci sopra membro a membro l'altro oggetto
-- 
-----BEGIN GEEK CODE BLOCK-----
Version 3.1 (with proprietary extensions)
Comments: waiting for version 4.0 ;)
GE/M/S/O d- s:--- !a C++++()>$ UL P+>+++ L+>++ e w++>$ N++ o-- K- W++ O? 
M? V? PS++ PE- Y+>+++ PGP++ t+ 5? X++(+) R tv--  b++>++++ DI++ D++ G-- e 
h! !r xy**
------END GEEK CODE BLOCK------


Vorrei chiamare la funzione passando un puntatore alla
variabile passata in modo che i cambiamenti fatti alla
variabile siano visibili nello script chiamante.


Ho fatto delle prove e mi e' parso di no comunque posso fare un' ulteriore
verifica. Siccome avevo trovato una soluzione alternativa avevo abbandonato
quella strada.
grazie Giuseppe

>Ho fatto delle prove e mi e' parso di no comunque posso fare un' ulteriore
Gli oggetti sono quelli creati con l'operatore new.
Ad esempio:
var prova1 = new String("STRINGA")
var prova2 = "STRINGA"
funzione(prova1, prova2)
In teoria prova1 viene passato per reference, e prova2 per valore
L'operatore new inoltre (se non sbaglio perché non ho mai provato) dovrebbe
imporre di creare una copia di una variabile nei casi in cui viene creato in
automatico un puntatore.
var prova3 = new String(valore)
var prova4 = valore
Prova 3 *dovrebbe* essere una copia di valore, prova4 un puntatore a valore.
Bye
FontN


Io ho fatto questa prova:
...
    var s = "Giuseppe"   // oppure: var s = new String("Giuseppe")
    testPassa(s)
    doc.write(s)            // dove doc e' una variabile che punta ad un
frame del documento
    documento corrente
    doc.close()
}
function testPassa(sStr)
{
    sStr += " testo accodato"
}
ed invece di scrivere in fondo al documento il testo *Giuseppe testo
accodato*
scrive sempre e solo *Giuseppe*
ho verificato sia su Explorer che su Netscape

 ha scritto nel messaggio
news:95eg85$53gs$1...@stargate1.inet.it...

[]
Mi sembra che puoi referenziare solo gli oggetti non le stringhe
letterali che condividono un unico oggetto globale String.
Gli oggetti String (creati con new) anche se come caratteristica
espongono direttamente il *valueOf* sono degli oggetti autonomi e
separati.
Se a una variabile assegni un oggetto non puoi piu' manipolare la
variabile perche' altrimenti sostituisci l'oggetto stesso; puoi invece
manipolare l'oggetto con dei metodi.
Una variabile var s = new String("Giuseppe") e' valorizzata con
l'oggetto finche' non viene manipolata la variabile stessa *s+='...'*;
dopo di che *s* non e' piu' l'oggetto String iniziale ma una stringa
letterale che somma il valore dell'oggetto con la nuova stringa.
La manipolazione di un oggetto viene fatta attraverso i
metodi/attributi:
es.: s.testo="Giuseppe"
in questo modo s rimane un oggetto ed e' possibile operare per
riferimento.
Prova con il seguente codice:
-----------
var s = {test:"Giuseppe"};
// che corrisponde a
// var s = new String();
// s.test="Giuseppe";
testPassa(s)
alert(s.test)
function testPassa(sStr) {            // sStr e' un riferimento
all'oggetto s
    sStr.test += " testo accodato";
}
----------
Puoi valorizzare .test anche nella funzione che in ogni caso verra'
mantenuto il riferimento:
------------------
 var s = new String();
testPassa(s)
alert(s.test)
function testPassa(sStr) {            // sStr e' un riferimento
all'oggetto s
    sStr.test = " testo accodato";
}
-----------------
Spero di essere stato sufficientemente preciso.
Saluti, Paolo


Ti ringrazio della spiegazione, cosi' indubbiamente funziona :-)
bye Giuseppe