La portée définit la zone dans laquelle les fonctions, les variables et autres sont disponibles. La disponibilité d'une variable, par exemple, est définie dans son contexte, c'est-à-dire la fonction, le fichier ou l'objet dans lequel elle est définie. Nous appelons généralement ces variables locales.
La partie lexicale signifie que vous pouvez dériver la portée en lisant le code source.
La portée lexicale est également connue sous le nom de portée statique.
La portée dynamique définit les variables globales qui peuvent être appelées ou référencées de n'importe où après avoir été définies. Elles sont parfois appelées variables globales, même si les variables globales dans la plupart des langages de programmation ont une portée lexicale. Cela signifie que l'on peut déduire de la lecture du code que la variable est disponible dans ce contexte. Peut-être faut-il suivre une clause uses ou includes pour trouver l'instatiation ou la définition, mais le code/compilateur connaît la variable à cet endroit.
En revanche, dans le cas du scoping dynamique, vous cherchez d'abord dans la fonction locale, puis dans la fonction qui a appelé la fonction locale, puis dans la fonction qui a appelé cette fonction, et ainsi de suite, en remontant la pile d'appels. Le terme "dynamique" fait référence au changement, en ce sens que la pile d'appel peut être différente à chaque fois qu'une fonction donnée est appelée, et que la fonction peut donc toucher différentes variables selon l'endroit d'où elle est appelée. (voir aquí )
Pour voir un exemple intéressant de portée dynamique, voir aquí .
Pour plus de détails, voir aquí y aquí .
Quelques exemples en Delphi/Object Pascal
Delphi a une portée lexicale.
unit Main;
uses aUnit; // makes available all variables in interface section of aUnit
interface
var aGlobal: string; // global in the scope of all units that use Main;
type
TmyClass = class
strict private aPrivateVar: Integer; // only known by objects of this class type
// lexical: within class definition,
// reserved word private
public aPublicVar: double; // known to everyboday that has access to a
// object of this class type
end;
implementation
var aLocalGlobal: string; // known to all functions following
// the definition in this unit
end.
La paire de fonctions RegisterClass()/GetClass() est ce qui se rapproche le plus de la portée dynamique dans Delphi. Pour son utilisation, voir aquí .
Disons que le moment où RegisterClass([TmyClass]) est appelé pour enregistrer une certaine classe ne peut être prédit par la lecture du code (il est appelé dans une méthode de clic de bouton appelée par l'utilisateur), le code appelant GetClass('TmyClass') obtiendra un résultat ou non. L'appel à RegisterClass() ne doit pas nécessairement se trouver dans le champ lexical de l'unité qui utilise GetClass() ;
Une autre possibilité de portée dynamique est méthodes anonymes (fermetures) dans Delphi 2009, car ils connaissent les variables de leur fonction d'appel. Elles ne suivent pas le chemin d'appel de manière récursive et ne sont donc pas entièrement dynamiques.
100 votes
Dans le podcast 58, Joel encourage les questions de ce genre car il souhaite que SO devienne LE lieu où l'on trouve des réponses, même si elles ont déjà été données ailleurs. Cette question est valable, même si on pourrait la formuler de manière un peu plus polie.
0 votes
Et puis surtout fr.wikipedia.org/wiki/Scope_(programmation) qui contient un bel exemple (Pascal/Delphi) de scopes imbriqués dans des procédures imbriquées.
7 votes
@rahul Je comprends que c'est une vieille question. Mais je suis sûr que même en 2009, SO s'attendait à ce que les demandeurs mettent en quelques efforts de base pour le résoudre. En l'état actuel des choses, il ne montre pas tout effort du tout. C'est peut-être pour cela qu'il a été descendu par beaucoup ?
16 votes
Il est possible que l'auteur de la question ne parle pas (ou n'ait pas parlé) couramment l'anglais lorsqu'il a écrit cette question.
38 votes
La question est polie, il dit juste ce qu'il veut. Vous êtes libre de répondre. Pas besoin de politesse excessive ici.
33 votes
Je pense que les questions de ce genre sont excellentes car elles permettent de créer du contenu pour les OS. IMO, qui se soucie si la question n'a pas d'effort... les réponses auront un grand contenu et c'est ce qui compte sur ce forum.
6 votes
Je suis d'accord avec @Jwan622 une question n'a pas besoin d'être verbeuse pour être une bonne question.