Documentation Flash CS3 |
|||
| Programmation avec ActionScript 3.0 > Syntaxe et langage ActionScript > Fonctions > Domaine de la fonction | |||
Le domaine d'une fonction détermine non seulement l'endroit où cette fonction peut être appelée dans un programme, mais également les définitions auxquelles la fonction peut accéder. Les mêmes règles de domaine qui s'appliquent aux identifiants de variable s'appliquent aux identifiants de fonction. Une fonction déclarée dans le domaine global est disponible à travers votre code. Par exemple, ActionScript 3.0 contient des fonctions globales (isNaN() et parseInt(), par exemple) disponibles n'importe où dans votre code. Une fonction imbriquée (une fonction déclarée dans une autre fonction) peut être utilisée n'importe où dans la fonction dans laquelle elle a été déclarée.
Chaque fois qu'une fonction commence une exécution, des objets et des propriétés sont créés. Premièrement, un objet spécial appelé objet d'activation est créé. Il stocke les paramètres et les variables locales ou fonctions déclarées dans le corps de la fonction. Vous ne pouvez pas accéder directement à l'objet d'activation car il s'agit d'un mécanisme interne. Deuxièmement, une chaîne de domaine est créée. Elle contient une liste ordonnée d'objets que Flash Player vérifie, à la recherche de déclarations d'identifiant. Chaque fonction qui exécute a une chaîne de domaine stockée dans une propriété interne. Dans le cas d'une fonction imbriquée, la chaîne de domaine commence avec son objet d'activation, suivi par l'objet d'activation de sa fonction parent. La chaîne continue de cette façon jusqu'à ce que l'objet global soit atteint. L'objet global est créé lorsqu'un programme ActionScript commence, et contient toutes les fonctions et les variables globales.
Une fonction closure est un objet qui contient un instantané d'une fonction et de son environnement lexical. L'environnement lexical d'une fonction comprend toutes les variables, propriétés, méthodes et les objets dans la chaîne de domaine de la fonction, ainsi que leurs valeurs. Les fonctions closures sont créées chaque fois qu'une fonction est exécutée à part d'un objet ou d'une classe. Le fait que les fonctions closures conservent le domaine dans lequel elles ont été définies crée des résultats intéressants lorsqu'une fonction est transférée en tant qu'argument ou valeur de renvoi dans un domaine différent.
Par exemple, le code suivant créé deux fonctions : foo(), qui renvoie une fonction imbriquée appelée rectArea() qui calcule la surface d'un rectangle, et bar(), qui appelle foo() et stocke la fonction closure renvoyée dans une variable nommée myProduct. Même si la fonction bar() définit sa propre variable locale x (avec une valeur de 2), lorsque la fonction closure myProduct() est appelée, elle conserve la variable x (avec une valeur de 40) définie dans la fonction foo(). La fonction bar() renvoie par conséquent la valeur 160 au lieu de 8.
function foo():Function
{
var x:int = 40;
function rectArea(y:int):int // fonction closure définie
{
return x * y
}
return rectArea;
}
function bar():void
{
var x:int = 2;
var y:int = 4;
var myProduct:Function = foo();
trace(myProduct(4)); // fonction closure appelée
}
bar(); // 160
Les méthodes se comportent de la même façon car elles conservent également les informations concernant l'environnement lexical dans lequel elles ont été créées. Cette caractéristique n'est pas visible lorsqu'une méthode est extraite de son instance, ce qui crée une méthode liée. La différence principale entre une fonction closure et une méthode liée est que la valeur du mot-clé this dans une méthode liée se réfère toujours à l'instance à laquelle elle était associée à l'origine, alors que dans une fonction closure, la valeur du mot-clé this peut changer. Pour plus d'informations, voir Les méthodes liées.
Flash CS3
M'envoyer un message électronique lorsque des commentaires sont ajoutés à cette page | Rapport de commentaire
Page en cours: http://livedocs.adobe.com/flash/9.0_fr/main/00000057.html