对于Function.call() 和Function.apply 再次理解。
在Cairngorm2中曾看到不定参数不能二次传递的bug,后来在使用Adobe的rpc组件时,发现RemoteObject是可以使用不定参数的,而RemoteObject是对NetConnection的封装,那么Adobe是如何做到不定参数的二(N?)次传递的呢?
实现原理很简单,仅是用到了Function对象的apply方法:
-----------------------------------------例子:
package com.test
{
import flash.display.Sprite;
public class ParamsTest extends Sprite
{
public function ParamsTest()
{
super();
a("A", "B", "C");
}
private function a(...args):void{
trace("a()", args);
b.apply(this, args);
b.call(this, args);
}
private function b(...args):void{
trace("b()", args, "是数组吗:", (args[0] is Array) );
try{
c.apply(this, args);
}catch(e:Error){
trace(e);
}
}
private function c(_a:*, _b:*, _c:*):void{
trace("c()", _a, _b, _c);
}
}
}
输出:
a() A,B,C
[SWF] E:\code\game\SceneAvatar2\bin-debug\ParamsTest.swf - 解压缩后为 1,971 个字节
b() A,B,C 是数组吗: false
c() A B C
b() A,B,C 是数组吗: true
ArgumentError: Error #1063: com.test::ParamsTest/c() 的参数数量不匹配。应该有 3 个,当前为 1 个。
b() A,B,C 是数组吗: true
ArgumentError: Error #1063: com.test::ParamsTest/c() 的参数数量不匹配。应该有 3 个,当前为 1 个。
说明:
b.apply(this, args);
b.call(this, args);
只有apply动用成功!
与 Function.call()
(它将参数指定为用逗号分隔的列表)不同,该方法将参数指定为一个 Array 对象。如果在脚本实际执行前,无法知道要传递的参数的数量,那么这种方法通常很有用。