2010-09-14 4 views
4
package { 
    import flash.display.Sprite; 

public class test1 extends Sprite { 

private var tmp:Object; 

public function test1() { 
    createObj(tmp); 
    if(tmp == null) { 
    trace("nothing changed"); 
    } 
} 

private function createObj(obj:Object):void { 
    obj = new Object(); 
} 

} 
} 

Dans le code ci-dessus la sortie de la console est:
rien n'a changépasse Actionscript par référence

Pourquoi?

Si l'argument de createObj a été passé par référence (qui est le comportement par défaut d'actionscript), pourquoi n'a-t-il pas été modifié?

Répondre

4

Vous ne transmettez pas de référence. Vous passez null qui est affecté à la variable locale obj pour une utilisation dans la fonction.

Passing arguments by value or by reference:

Pour être passé par référence signifie que seulement une référence à l'argument est passé au lieu de la valeur réelle. Non copie de l'argument réel est faite. Au lieu de cela, une référence à la variable passée en tant qu'argument est créée et affectée à une variable locale pour l'utilisation dans la fonction.

En createObj vous créez une nouvelle référence que vous devez retourner:

public function test1() { 
    tmp = createObj(); 
    if(tmp != null) { 
    trace("Hello World!"); 
    } 
} 

private function createObj():Object { 
    return new Object(); 
} 
+0

Votre réponse résout le problème de l'OP, mais je pensais que j'ajouterais que 'null' ne change vraiment comment les choses fonctionnent ici. C'est dommage que les docs soient si mal écrits. Tout ce paragraphe dans les documents est un désordre royal et n'a guère de sens. AS stocke les références aux objets dans les variables (ou les paramètres). Une référence est un "lien" à un objet, pas l'objet lui-même. Les références sont * copiées * lorsqu'elles sont passées à une fonction; donc ils sont passés * en valeur *. AS a passé par la valeur sémantique (c'est pourquoi vous ne pouvez pas implémenter l'exemple classique de "swap" dans AS). * AS transmet les références par valeur *. –

+2

PS. Voici un bon article qui explique la différence entre passer par référence et passer une référence par valeur: http://javadude.com/articles/passbyvalue.htm. C'est à propos de Java mais cela s'applique aussi à Actionscript. –

Questions connexes