Merci,
J'avais aussi posté sur www.flash-forum.net (http://flash.media-box.net/viewtopic.php?t=29754), mais pas de réponse non plus...
Sinon, j'ai bien une petite piste, mais je n?ai pas encore eu le temps d'approfondir.
Il s'agirait (après qu'un ami m'ait mis la puce à l'oreille) d'une affaire d'allocation de mémoire. Il semblerait que les références ne soient pas supprimées et que, donc, en appelant une classe détruite, au lieu de renvoyer "undefined", il recrée le "chaînon manquant" et par la même la chaîne de dépendance entre les références... faut que je regarde plus avant.
Sinon, le bug qui n'en est pas un dans le cas 2:
AClass=function () { trace("hello"); // maFn = function () { } }
oObj = new AClass();
|
maFn se retrouve sur le _root car en fait ce n?est pas une fonction privée mais bien une function définit dans une variable qui elle est sur le root
rappel :
var maVar = déclaration explicite
maVar == déclaration implicite (bad way in fact...)
C'est d'autant plus important dans une function
"var" rendant l'attribut privé (local et invisible, appartenant à la fonction) sinon l'attribut appartient au root automatiquement...
Et il en va de même pour les nested function :
il vaut mieux écrire
que
Et là encore.... ca pose un problème car flash fait plus l'auto-format correctement (normal, il prend la déclaration de fonction pour une variable, donc il fait p^lus les saut de ligne, et tout les commentaires de votre fonction disparaissent, vous pouvez essayer avec ca par exemple :
AClass = function () { // var maFn = function () { // mon commentaire trace("Fn 2"); } };
|
Maintenant, lancez l'auto-format (Ctrl+Shift+F), et vous obtiendrez cela:
AClass = function () { // var maFn = function () { trace("Fn 2");}; };
|
donc, j'insiste, sur le coup j'ai cru a un bug, mais non, la c'est bon car flash fait une différence (et c'est bien normal) entre une
déclaration de variable:
var maVar // maVar // maFn // maClass
|
et une
:déclaration de function (et il en existe une seule):
Conclusion de ma petite affaire
écrire
ou
Ce n'est pas déclarer une fonction mais bien faire un passage par référence d'une fonction dans une variable... il est "équivalent" écrire :
maFn =null;
function refFn (){
}
maFn = refFn;
Donc dans le cas deux, écrire:
AClass = function () { // maFn = function () { trace("private function of AClass but public function by ref of maFn"); } maFn = refFn; }; oObj = new AClass(); maFn();
|
équivaut a écrire
AClass = function () { // maFn = "une variable sur le _root"; function refFn() { trace("private function of AClass but public function by ref of maFn"); } maFn = refFn; }; oObj = new AClass(); maFn();
|
Bon, c'est clair pour moi, mais suis pas sur de l,avoir écrit aussi clairement pour vous ;)
Je vais regarder les implications sur le cas d'adressage de function dans les namespace (création de package a la moock.org) org.moock.maClass (ou maFn, c'est pareil) = function (){}
Ca pourrait poser en fait un certains problèmes... (d'ailleurs c'est ptete pour ca que les dvpeurs de macromedia, dans leurs composant ne font pas de namespace, ils mettent tout sur le _root ou sur le _global... je vais réfléchir sur la question, ce serait une bien embêtante bien cette affaire là...
--
Jc.D.