對於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 對象。如果在腳本實際執行前,無法知道要傳遞的參數的數量,那麼這種方法通常很有用。