愚人呓语 eidiot's blog. My flapdoodles.

19七/06

AS3学习笔记(4)-Function

  首先,AS3里function的参数可以有默认值了。

public function TestFunc(){
    
myFunc();
}
private function myFunc(para1:int=10,para2:String="str"):void{
    
trace(para1 + " , " + para2);    //10 , str
}

  AS3里不能给出多余的参数(少了也不行,所有没有默认值的参数都必须给值),

public function TestFunc(){
    
myFunc(2,"3",4);
}
private function myFunc(para1:int,para2:String):void{
    
trace(para1 + " , " + para2);
}

编译器给出参数不匹配的错误:ArgumentError: Error #1063: Argument count mismatch on TestFunc/TestFunc::myFunc(). Expected 2, got 3.
  这样以前那种用 arguments 拿到不固定参数的方法就不能用了。AS3给出一个新的关键字:... (rest) parameter

public function TestFunc(){
    
myFunc(2,"3",4,"5",true);
}
private function myFunc(para1:int,para2:String,... more):void{
    
trace(para1 + " , " + para2);    //2 , 3
    
trace(more);    //4,5,true
}

  在固定的参数后面跟一个 “...” 和一个表达式(如例子中的“more”),“...” 后面所有的参数将被放到以该表达式命名的数组中。注意 “...” 必须是最后一个参数。
  如果使用 “...” arguments 就不可用了,自然也就拿不到 arguments.callee(对当前正在执行的函数的引用),所以在确定不使用 callee 的情况下才能用 “...”。
  提到 arguments ,arguments.caller 已经被 "remove" 了。要想拿到 caller 需要把调用函数的 callee 作为参数传给被调用函数。官方的例子:

package {
    
import flash.display.Sprite;
 
    
public class ArgumentsExample extends Sprite {
        
private var count:int = 1;
        
        
public function ArgumentsExample() {
            
firstFunction(true);
        
}
 
        
public function firstFunction(callSecond:Boolean) {
            
trace(count + ": firstFunction");
            
if(callSecond) {
                
secondFunction(arguments.callee);
            
}
            
else {
                
trace("CALLS STOPPED");
            
}
        
}
 
        
public function secondFunction(caller:Function) {
            
trace(count + ": secondFunction\n");
            
count++;
            
caller(false);
        
}       
    
}
}
  • chengye

    有个问题想问一下,
    下面的代码:
    var arr:Array =new Array();
    arr.push (“aa”);
    arr.push (“bb”);
    //……
    //
    function aa(){
    trace(“aa”);
    }
    function bb(){
    trace(“bb”);
    }
    //……
    数组中存放的是函数名,下面是对应的一个个函数,能不能有个什么办法可以一下子把数组中所有的函数都执行一次阿

  • http://eidiot.net eidiot

    var funcArr : Array = new Array();
    funcArr.push(aa);
    funcArr.push(bb);
    function aa() : void
    {
    trace(“aa”);
    }
    function bb() : void
    {
    trace(“bb”);
    }
    for each (var func : Function in funcArr)
    {
    func();
    }