Actionscript 3 在函数中传递一个变量,然后在ActionScript 3中更改原始变量

Actionscript 3 在函数中传递一个变量,然后在ActionScript 3中更改原始变量,actionscript-3,variables,parameters,Actionscript 3,Variables,Parameters,我试图创建一个可重用函数,它可以将全局变量作为参数,然后更改该变量,以便其他函数可以使用它。然而,我的理解是,为函数创建的参数的作用域仅限于该函数,因此我无法更改全局变量 函数需要能够将不同的变量作为参数(参见第9行和第14行)。我如何才能让它改变第1行的myVar,以便其他函数可以读取它 谢谢你的意见 1. var myVar1:Boolean; 2. var myVar2:Boolean; 3. 4. myMc1.addEventListener(MouseEvent.CLICK

我试图创建一个可重用函数,它可以将全局变量作为参数,然后更改该变量,以便其他函数可以使用它。然而,我的理解是,为函数创建的参数的作用域仅限于该函数,因此我无法更改全局变量

函数需要能够将不同的变量作为参数(参见第9行和第14行)。我如何才能让它改变第1行的myVar,以便其他函数可以读取它

谢谢你的意见

1.   var myVar1:Boolean;
2.   var myVar2:Boolean;
3.
4.   myMc1.addEventListener(MouseEvent.CLICK, onMC1Clicked);
5.   myMc2.addEventListener(MouseEvent.CLICK, onMC2Clicked);
6. 
7.   function onMC1Clicked(evt:MouseEvent):void
8.   {
9.       toggleState(myMc1, myVar1, myFunction);
10.  }
11.   
12.  function onMC2Clicked(evt:MouseEvent):void
13.  {
14.      toggleState(myMc2, myVar2, myFunction);
15.  }
16.
17.  function toggleState(mc:MovieClip, _switch:Boolean, funct:Function):void
18.  {
19.      switch (_switch)
20.      {
21.          case false:
22.          _switch = true;
23.          mc.gfx1.visible = true;
24.          mc.gfx2.visible = false;
25.          break;
26. 
27.          case true:
28.          _switch = false;
29.          mc.gfx1.visible = false;
30.          mc.gfx2.visible = true;
31.          break;
32.      }
33.      funct();
34.  }
35.
36.  fuction myFunction():void
37.  {
38.      trace('fired');
39.  }

正如我在评论中所说,
在AS3中,属于基本数据类型(包括Boolean、Number、int、uint和String)的对象的行为就像是通过值传递的,而不是通过引用传递的。您需要将基本体包装成非基本体类型,例如对象,然后通过引用传递

因此,而不是
切换状态(myMc1、myVar1、myFunction)

您将执行
切换状态(myMc1,{bool:myVar1},myFunction)

您的函数如下所示:

function toggleState(mc:MovieClip, myBoolObject:Object, funct:Function):void
{
    var _switch:Boolean = myBoolObject.bool;
    switch (_switch)
    {
        //etc...
    }
}
但是

由于您的MC两者的行为方式相同,因此我建议使用此方法整合一些代码:

//MovieClips are dynamic classes, meaning you can dynamically add properties to them
myMc1._toggled = false;
myMc2._toggled = false;

//You can share the same event handler for both buttons
myMc1.addEventListener(MouseEvent.CLICK, onMCClicked);
myMc2.addEventListener(MouseEvent.CLICK, onMCClicked);

function onMC1Clicked(evt:MouseEvent):void
{
   //Get the clicked button
   var mc:MovieClip = evt.currentTarget as MovieClip;
   toggleState(mc, myFunction);
}

function toggleState(mc:MovieClip, funct:Function):void
{
    //change the button state 
    mc._toggled = !mc._toggled;
    mc.gfx1.visible = !mc._toggled;
    mc.gfx2.visible = mc._toggled;
    funct();
}

fuction myFunction():void
{
    trace('fired');
}

您可以做的是让函数接受一个对象和一个属性名(字符串),然后使用语法更改对象的属性。例如:

function toggle(object:Object, property:String):void {
    object[property] = !object[property];
}

var object:Object = { checked: true }

trace(object.checked); // true

toggle(object, "checked");

trace(object.checked); // false

因为您已经将它设置为全局变量,这意味着所有函数都已经可以访问它,所以不需要在它们之间传递它。只需直接从
toggleState
方法中设置
myVar
。很抱歉,我应该澄清我希望能够将不同的变量传递到函数中,因此我无法从函数中设置“myVar”方向。我编辑了这篇文章来澄清。谢谢在AS3中,属于基本数据类型(包括Boolean、Number、int、uint和String)的对象的行为就像是通过值传递的,而不是通过引用传递的。您需要将基本体包装成非基本体类型,例如对象,然后通过引用传递。谢谢这为我节省了大约50行重复代码。