In che modo le funzioni hanno accesso alle variabili di script quando tali variabili di script non vengono passate alla funzione?Ho una funzione senza parametri di input, che utilizza una variabile di script.
Dalla mia comprensione con altri linguaggi di programmazione, la funzione dovrebbe avere accesso solo alle variabili passate o definite nella funzione.
Quando eseguo lo script di seguito restituisce 14. Perché funziona? C'è un modo per rendere più esclusive le variabili utilizzate dalla funzione?
scriptVar = 14;
myFunction = function({},{default local},
functionVar = scriptVar;
return(functionVar);
);
returnVar = myFunction();Grazie per l'aiuto.
Modellazione statistica avanzataAutomazione e scriptingAccesso ai datiProgettazione di esperimentiQualità e ingegneria di processoRi: In che modo le funzioni hanno accesso alle variabili di script quando tali variabili di script non vengono passate alla funzione?Ah, ora è chiaro.Immagino che questo dimostri quanto spesso io non usa Nomi predefiniti qui(1)...
Ri: In che modo le funzioni hanno accesso alle variabili di script quando tali variabili di script non vengono passate alla funzione?Grazie per aver colto il mio errore. Volevo dire questo le variabili sono globali per impostazione predefinita .
Hai cambiato le cose quando hai richiamato lo spazio dei nomi Here. Ho modificato il tuo script per illustrare lo spazio dei nomi globale in vigore:
// Names Default To Here( 1 );
Delete Symbols();
fn1 = Function( {x},
fn2 = Function( {x},
2*x;
);
5*fn2(x);
);
Show Symbols();
y = fn1(10);
Show( y );
Show Symbols();
Il registro mostra:
// Global
fn1 = Function( {x},
fn2 = Function( {x}, 2 * x );
5 * fn2( x );
);
// 1 Global
y = 100;
// Global
fn1 = Function( {x},
fn2 = Function( {x}, 2 * x );
5 * fn2( x );
);
fn2 = Function( {x}, 2 * x );
y = 100;
// 3 Global
Quindi fn2 è anche una variabile globale, per impostazione predefinita. È necessario indicare che si preferisce l'eccezione, una variabile locale, quando necessario.
Ri: In che modo le funzioni hanno accesso alle variabili di script quando tali variabili di script non vengono passate alla funzione?Per controllare l'ambito delle variabili nelle funzioni usiamo la dichiarazione {default local}.Ma le variabili al di fuori delle funzioni hanno un ambito globale, ecco perché 'scriptvar' era visibile alla funzione.Per prevenire questo comportamento usiamo la dichiarazione 'names default to here(1)'.
Ri: In che modo le funzioni hanno accesso alle variabili di script quando tali variabili di script non vengono passate alla funzione?Se capisco la domanda di Kelly, l'obiettivo è evitare di utilizzare inavvertitamente variabili globali, piuttosto che essere il comportamento desiderato.
Cosa intendi per funzioni globali per impostazione predefinita?La mia comprensione era che le funzioni persistono solo finché esiste il loro spazio dei nomi contenente, quindi nell'esempio seguente fn1 è memorizzato nello spazio dei nomi here (o globale in assenza di nomi per impostazione predefinita qui (1)) ma fn2 scompare non appena fn1 finisce in esecuzione, quindi viene ricreato ogni volta che viene eseguito fn1.
names default to here(1);
delete symbols();
fn1 = function({},
fn2 = function({},
1
);
);
show symbols();
/*
Returns:
// Here
fn1 = Function( {},
fn2 = Function( {}, 1 )
);
// 1 Here<BR />*/
Ri: In che modo le funzioni hanno accesso alle variabili di script quando tali variabili di script non vengono passate alla funzione?Grazie!
Apprezzo la spiegazione e gli esempi che posso usare come alternative.Ri: In che modo le funzioni hanno accesso alle variabili di script quando tali variabili di script non vengono passate alla funzione?Le variabili sono globali per impostazione predefinita e persistono dopo l'esecuzione dello script.
Perché usi una variabile globale nell'espressione per la definizione della funzione? Se hai bisogno del valore, usa un parametro di funzione e passa l'argomento quando chiami la funzione.
Ri: In che modo le funzioni hanno accesso alle variabili di script quando tali variabili di script non vengono passate alla funzione?La funzione prima cerca nel proprio spazio dei nomi per risolvere simboli/variabili, quindi se non trova una variabile cerca progressivamente negli spazi dei nomi padre per trovare un valore prima di restituire un valore mancante.Si noti che se la variabile fosse creata all'interno della funzione non sarebbe accessibile nel resto del codice.Sono d'accordo che questa è una fonte comune di errori.
Puoi utilizzare la funzione locale per assicurarti di lavorare con una variabile locale.Questo è spesso utile per variabili di iterazione comuni come 'i' che potrebbero essere utilizzate inavvertitamente nei cicli for nidificati. Ecco un esempio;
scriptVar = 14;
myFunction = function({},{default local},
local({scriptVar},
functionVar = scriptVar;
return(functionVar);
);
);
returnVar = myFunction(); //Returns emptyPoiché la dichiarazione di variabili locali nelle funzioni è un caso d'uso comune, questo comportamento è incorporato nella funzione 'funzione':
scriptVar = 14;
myFunction = function({}, {scriptVar = .},
functionVar = scriptVar;
return(functionVar);
);
returnVar = myFunction();