3. Les fonctions en JavaScript
Un exemple que je n'ai pas abordé ici c'est les fonctions
Vous aurez remarqué que les fonctions JavaScript ne sont pas apellée directement, mais bien avec apply... Pourquoi ?
En fait, une fonction est un JSIO (ActiveX interfacé)
En gros, il existe en code compilé la classe suivante :
Cet objet hérite donc bien de Dictionnary[String, Object] par le biais JSO
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 class JSFunction : JSO { // Code JavaScript de la fonction ("function(value) { ... }") private _JSCode : String; public function apply(this, arguments) { return _MSCompil.exec(_JSCode, this, arguments); } public function call(this, paramArray arguments) { return apply(this, arguments); } /* ... */ }
Ensuite, le compilateur JavaScript fait le reste.
Une propriété intéressante de cette classe est le SCOPE
Il s'agit de toutes les variables accessibles à la fonction
Exemple :
D'où la fonction f1 tire-t-elle window ???
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 function f1() { window.alert("F1 a été appelée"); }
En fait, de son scope
Voici en gros une explication simple du code compilé
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 /* Code généré lors de la création de la page */ var __scope = new JSScope(); for (property in window) { __scope.setKeyValue(property, window.retreiveValue(property)) } /* Code compilé */ var f1 = new JSF(__scope.createCopy(), "function () { ... }") /* Code résultant de la compilation par __MSCompil.exec de f1 __scope est une copie de __scope déclaré plus haut ==> Ils évoluent pour l'instant de manière indépendante et si je changeais la valeur de window dans la fonction, cela ne changerait pas celle du __scope en dehors de la fonction */ function(this, arguments) { // Intègre les arguments dans le scope __scope.setKeyValue("this", this); __scope.setKeyValue("arguments", arguments); // Code compilé proprement dit var __tmp1 = __scope.retreiveValue("window"); __tmp1.retreiveValue("alert").apply( __tmp1, "F1 a été appelée" ); // Remet tout à zéro (il ne vaut pas que la prochaine fois que la fonction soit appelée les variables soient conservées) // En gros __scope redevient une copie conforme du __scope duquel il vient __scope.reset(); }
Partager