在函数调用中展开... args数组

时间:2010-12-13 18:58:19

标签: javascript flash actionscript-3 externalinterface

我正在对JavaScript方法进行大量的ExternalInterface调用,并且有一个辅助函数来执行此操作:

protected function JSCall( methodName:String, ...args ):void
{
  try
  {
    ExternalInterface.call( methodName, args );
  }
  … etc …
}

然而,这意味着JavaScript方法只会传递一个参数 - 参数数组 - 意味着我必须更改JavaScript以适应这种情况,例如:而不是:

function example(argument1, argument2)
{

}

我最终得到了:

function example(args)
{
  var argument1 = args[0];
  var argument2 = args[1];
}

我想要做的是展开传递给JSCall方法的参数数组,以便每个参数单独传递给ExternalInterface调用,这样:

JSCall('example', ['one', 'two'])

的工作方式如下:

ExternalInterface.call('example', 'one', 'two')

3 个答案:

答案 0 :(得分:3)

要从具有多个参数的flash调用javascript函数,您所要做的就是:

ExternalInterface.call.apply(null, [functionName, arg1, arg2, ..., argn]);

如果你从另一个函数的变量参数列表中获取参数,那么你可以使用:

function JSCall(methodName:String, ...args):void
{
    if (ExternalInterface.available){
        args.unshift(methodName);
        ExternalInterface.call.apply(null, args);
    }

    //btw, you can do the same with trace(), or any other function
    args.unshift('Calling javascript function');
    trace.apply(null, args);
}

您可以致电其他地方:

JSCall('console.log', 'Testing', 123, true, {foo:'bar'});

...会在你的firebug / webkit控制台上打印Testing 123 true Object之类的内容。

这是经过测试并确实有效,因为我在一个真实的项目中使用它。

答案 1 :(得分:2)

嘿Cameron,你尝试过使用Function.apply()吗?试试这个:

ExternalInterface.call.apply( methodName, args );

这太疯狂了,它可能会奏效!

答案 2 :(得分:0)

在JavaScript中,Function.call.apply(foo, [that, test, bla])的工作方式与foo.call(that, test, bla)类似,但由于ExternalInterface.call不等于Function.prototype.call,我们需要在此处使用不同的方法。

// Let's fake ExternalInterface
var funcs = {
    example: function(arg1, arg2) {
        console.log(arg1, arg2);
    }
};

var ExternalInterface = {};
ExternalInterface.call = function() {
    var f = funcs[arguments[0]];
    f.call.apply(f, arguments);
}


// This does crazy stuff.
function JSCall(func, args) {
    args.unshift(func);
    ExternalInterface.call.apply(ExternalInterface, args);
}

// These do the same now
ExternalInterface.call('example', 'one', 'two'); // one two
JSCall('example', ['one', 'two']); // one two

注意:我没有在ActionScript中测试过这个。