Wie haben Funktionen Zugriff auf Skriptvariablen, wenn diese Skriptvariablen nicht an die Funktion übergeben werden?Ich habe eine Funktion ohne Eingabeparameter, die eine Skriptvariable verwendet.
Nach meinem Verständnis mit anderen Programmiersprachen sollte eine Funktion nur Zugriff auf Variablen haben, die an die Funktion übergeben oder in ihr definiert werden.
Wenn ich das folgende Skript ausführe, wird 14 zurückgegeben. Warum funktioniert das? Gibt es eine Möglichkeit, die von der Funktion verwendeten Variablen exklusiver zu gestalten?
scriptVar = 14;
myFunction = function({},{default local},
functionVar = scriptVar;
return(functionVar);
);
returnVar = myFunction();Vielen Dank für Ihre Hilfe.
Erweiterte statistische ModellierungAutomatisierung und SkripterstellungDatenzugriffVersuchsplanungQualitäts- und VerfahrenstechnikBetreff: Wie haben Funktionen Zugriff auf Skriptvariablen, wenn diese Skriptvariablen nicht an die Funktion übergeben werden?Ah, das ist jetzt klar.Ich denke, das zeigt, wie oft ich nicht Verwenden Sie Namen standardmäßig hier(1)...
Betreff: Wie haben Funktionen Zugriff auf Skriptvariablen, wenn diese Skriptvariablen nicht an die Funktion übergeben werden?Danke, dass du meinen Fehler bemerkt hast. Das wollte ich sagen Variablen sind standardmäßig global .
Sie haben Dinge geändert, als Sie den Here-Namensraum aufgerufen haben. Ich habe Ihr Skript geändert, um den tatsächlichen globalen Namensraum zu veranschaulichen:
// 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();
Das Protokoll zeigt:
// 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
Daher ist fn2 standardmäßig auch eine globale Variable. Bei Bedarf müssen Sie angeben, dass Sie die Ausnahme, eine lokale Variable, bevorzugen.
Betreff: Wie haben Funktionen Zugriff auf Skriptvariablen, wenn diese Skriptvariablen nicht an die Funktion übergeben werden?Um den Umfang von Variablen in Funktionen zu steuern, verwenden wir die Deklaration {default local}.Aber Variablen außerhalb von Funktionen haben einen globalen Gültigkeitsbereich – deshalb war „scriptvar“ für die Funktion sichtbar.Um dieses Verhalten zu verhindern, verwenden wir die Deklaration „names default to here(1)“.
Betreff: Wie haben Funktionen Zugriff auf Skriptvariablen, wenn diese Skriptvariablen nicht an die Funktion übergeben werden?Wenn ich Kellys Frage verstehe, besteht das Ziel darin, die versehentliche Verwendung globaler Variablen zu vermeiden, anstatt dass dies das gewünschte Verhalten ist.
Was meinst du damit, dass Funktionen standardmäßig global sind?Mein Verständnis war, dass Funktionen nur so lange bestehen bleiben, wie ihr enthaltender Namespace existiert. Im Beispiel unten wird fn1 im Here-Namespace gespeichert (oder global, wenn keine Namen standardmäßig hier(1) sind), aber fn2 verschwindet, sobald fn1 beendet ist läuft, sodass es jedes Mal neu erstellt wird, wenn fn1 ausgeführt wird.
names default to here(1);
delete symbols();
fn1 = function({},
fn2 = function({},
1
);
);
show symbols();
/*
Returns:
// Here
fn1 = Function( {},
fn2 = Function( {}, 1 )
);
// 1 Here<BR />*/
Betreff: Wie haben Funktionen Zugriff auf Skriptvariablen, wenn diese Skriptvariablen nicht an die Funktion übergeben werden?Danke!
Ich schätze die Erklärungen und Beispiele, die ich als Alternativen verwenden kann.Betreff: Wie haben Funktionen Zugriff auf Skriptvariablen, wenn diese Skriptvariablen nicht an die Funktion übergeben werden?Variablen sind standardmäßig global und bleiben nach der Skriptausführung bestehen.
Warum verwenden Sie im Ausdruck für die Funktionsdefinition eine globale Variable? Wenn Sie den Wert benötigen, verwenden Sie einen Funktionsparameter und übergeben Sie das Argument beim Aufruf der Funktion.
Betreff: Wie haben Funktionen Zugriff auf Skriptvariablen, wenn diese Skriptvariablen nicht an die Funktion übergeben werden?Die Funktion durchsucht zunächst ihren eigenen Namespace, um Symbole/Variablen aufzulösen. Wenn sie dann keine Variable findet, durchsucht sie schrittweise die übergeordneten Namespaces nach einem Wert, bevor sie einen fehlenden Wert zurückgibt.Beachten Sie, dass die Variable, wenn sie innerhalb der Funktion erstellt würde, im Rest Ihres Codes nicht zugänglich wäre.Ich stimme zu, dass dies eine häufige Fehlerquelle ist.
Sie können die lokale Funktion verwenden, um sicherzustellen, dass Sie mit einer lokalen Variablen arbeiten.Dies ist oft hilfreich für gängige iterierende Variablen wie „i“, die versehentlich in verschachtelten for-Schleifen verwendet werden könnten. Hier ist ein Beispiel;
scriptVar = 14;
myFunction = function({},{default local},
local({scriptVar},
functionVar = scriptVar;
return(functionVar);
);
);
returnVar = myFunction(); //Returns emptyDa die Deklaration lokaler Variablen in Funktionen ein häufiger Anwendungsfall ist, ist dieses Verhalten in die Funktion „function“ eingebettet:
scriptVar = 14;
myFunction = function({}, {scriptVar = .},
functionVar = scriptVar;
return(functionVar);
);
returnVar = myFunction();