Comment les fonctions ont-elles accès aux variables de script lorsque ces variables de script ne sont pas transmises à la fonction ?J'ai une fonction sans paramètres d'entrée, qui utilise une variable de script.
D'après ma compréhension des autres langages de programmation, la fonction ne devrait avoir accès qu'aux variables transmises ou définies dans la fonction.
Lorsque j'exécute le script ci-dessous, il renvoie 14. Pourquoi cela fonctionne-t-il ? Existe-t-il un moyen de rendre les variables utilisées par la fonction plus exclusives ?
scriptVar = 14;
myFunction = function({},{default local},
functionVar = scriptVar;
return(functionVar);
);
returnVar = myFunction();Merci pour votre aide.
Modélisation statistique avancéeAutomatisation et scriptAccès aux donnéesConception d'expériencesIngénierie de la qualité et des procédésRe : Comment les fonctions ont-elles accès aux variables de script lorsque ces variables de script ne sont pas transmises à la fonction ?Ah, c'est clair maintenant.Je suppose que cela montre à quelle fréquence je ne le faites pas utiliser les noms par défaut ici (1)...
Re : Comment les fonctions ont-elles accès aux variables de script lorsque ces variables de script ne sont pas transmises à la fonction ?Merci d'avoir rattrapé mon erreur. je voulais dire que les variables sont globales par défaut .
Vous avez changé des choses lorsque vous avez appelé l'espace de noms Here. J'ai modifié votre script pour illustrer l'espace de noms global en vigueur :
// 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();
Le journal affiche :
// 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
Donc fn2 est aussi une variable globale, par défaut. Vous devez indiquer que vous préférez l'exception, une variable locale, si nécessaire.
Re : Comment les fonctions ont-elles accès aux variables de script lorsque ces variables de script ne sont pas transmises à la fonction ?Pour contrôler la portée des variables dans les fonctions, nous utilisons la déclaration {default local}.Mais les variables en dehors des fonctions ont une portée globale - c'est pourquoi 'scriptvar' était visible pour la fonction.Pour éviter ce comportement, nous utilisons la déclaration 'names default to here(1)'.
Re : Comment les fonctions ont-elles accès aux variables de script lorsque ces variables de script ne sont pas transmises à la fonction ?Si je comprends la question de Kelly, le but est d'éviter d'utiliser par inadvertance des variables globales, plutôt que d'être le comportement souhaité.
Que voulez-vous dire par les fonctions sont globales par défaut?Ma compréhension était que les fonctions ne persistent que tant que leur espace de noms contenant existe, donc dans l'exemple ci-dessous fn1 est stocké dans l'espace de noms ici (ou global en l'absence de noms par défaut ici (1)) mais fn2 disparaît dès que fn1 se termine en cours d'exécution, il est donc recréé à chaque exécution de 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 />*/
Re : Comment les fonctions ont-elles accès aux variables de script lorsque ces variables de script ne sont pas transmises à la fonction ?Merci!
J'apprécie l'explication et les exemples que je peux utiliser comme alternatives.Re : Comment les fonctions ont-elles accès aux variables de script lorsque ces variables de script ne sont pas transmises à la fonction ?Les variables sont globales par défaut et persistent après l'exécution du script.
Pourquoi utilisez-vous une variable globale dans l'expression pour la définition de la fonction ? Si vous avez besoin de la valeur, utilisez un paramètre de fonction et transmettez l'argument lorsque vous appelez la fonction.
Re : Comment les fonctions ont-elles accès aux variables de script lorsque ces variables de script ne sont pas transmises à la fonction ?La fonction cherche d'abord dans son propre espace de noms pour résoudre les symboles/variables, puis si elle ne trouve pas de variable, elle parcourt progressivement les espaces de noms parents pour trouver une valeur avant de renvoyer une valeur manquante.Notez que si la variable était créée dans la fonction, elle ne serait pas accessible dans le reste de votre code.Je reconnais que c'est une source courante d'erreurs.
Vous pouvez utiliser la fonction locale pour vous assurer que vous travaillez avec une variable locale.Ceci est souvent utile pour les variables d'itération courantes telles que 'i' qui pourraient être utilisées par inadvertance dans des boucles for imbriquées. Voici un exemple;
scriptVar = 14;
myFunction = function({},{default local},
local({scriptVar},
functionVar = scriptVar;
return(functionVar);
);
);
returnVar = myFunction(); //Returns emptyÉtant donné que la déclaration de variables locales dans les fonctions est un cas d'utilisation courant, ce comportement est intégré à la fonction 'function' :
scriptVar = 14;
myFunction = function({}, {scriptVar = .},
functionVar = scriptVar;
return(functionVar);
);
returnVar = myFunction();