Я создал следующие обертки для вызова функции. Вы можете вызвать его по имени или по фактической функции. Я пытался сделать их максимально подверженными ошибкам.
Следующая функция преобразует имя функции в соответствующую функцию с учетом области видимости.
public static function parseFunc(func:*, scope:Object):Function {
if (func is String && scope && scope.hasOwnProperty(funcName)) {
func = scope[func] as Function;
}
return func is Function ? func : null;
}
Вызов
Подпись : call(func:*,scope:Object,...args):*
public static function call(func:*, scope:Object, ...args):* {
func = parseFunc(func, scope);
if (func) {
switch (args.length) {
case 0:
return func.call(scope);
case 1:
return func.call(scope, args[0]);
case 2:
return func.call(scope, args[0], args[1]);
case 3:
return func.call(scope, args[0], args[1], args[2]);
// Continue...
}
}
return null;
}
Применить
Подпись : apply(func:*,scope:Object,argArray:*=null):*
public static function apply(func:*, scope:Object, argArray:*=null):* {
func = parseFunc(func, scope);
return func != null ? func.apply(scope, argArray) : null;
}
Примечания
Вызов
Переключатель необходим, потому что и ...args
, и arguments.slice(2)
являются массивами. Вам нужно вызвать Function.call()
с переменными аргументами.
Применить
Встроенная функция (apply(thisArg:*, argArray:*):*
) использует нетипизированный аргумент для argArray
. Я просто отказываюсь от этого.