如何使用Javascript函数作为另一个函数的参数?

时间:2012-12-18 03:45:44

标签: javascript

每当我尝试在Chromium中运行此函数时,都会收到错误消息“Uncaught TypeError:Illegal invocation”。为什么会发生这种情况,我该如何解决?

getOutput([alert], ["Hi!", "Hello!", "Lolwut?"]); //why doesn't this call "alert"
//for each of the arguments?

//this function is supposed to return the output of each function for each argument.
function getOutput(functions, arguments){
    for(var i = 0; i < functions.length; i++){
        for(var j = 0; j < arguments.length; j++){
            functions[i](arguments[j]); //why doesn't this call the function
        }
    }    
}​

4 个答案:

答案 0 :(得分:3)

修改

虽然这里给出的修复有效,但原因似乎是rbtLong所建议的,原生函数(特别是alert)在其上下文之外被调用。使用这样的包装器:

function F(arg) {alert(arg);}
在代码中代替alert

使代码运行。尽管如此,如果您想要一个可以使用本机功能的通用功能,下面建议的修复仍然有效。


(顺便说一句:在Safari和Firefox中也是如此)

它似乎与数组访问构造有关,不允许在它之后立即调用。也许你不能做1.toString()。您可以像这样快速修复它:

getOutput([alert], ["Hi!", "Hello!", "Lolwut?"]);

function getOutput(functions, arguments){
    for(var i = 0; i < functions.length; i++){
        for(var j = 0; j < arguments.length; j++){
            var f = functions[i];
            f(arguments[j]);
        }
    }    
}​

答案 1 :(得分:1)

我相信这是因为你在其上下文之外调用一个对象,这里描述的method.call(args)http://www.devguru.com/technologies/ecmascript/quickref/call.html应该允许它。

functions[i].call(this, arguments[j])

答案 2 :(得分:1)

你的意思是:

function getOutput(fn, args) { 
 for(var f = 0; f < fn.length; f++){
    for(var j = 0; j < args.length; j++){
        fun = fn[f];
        fun.call(this, args[j]);
    }
  }

}
getOutput([alert], ["Hi!", "Hello!", "Lolwut?"]);

答案 3 :(得分:0)

我相信它会是这样的:

FUN1(FUN2( '洛尔'));

或艰难的方式

var hi7 = fun2('lol')

FUN1(hi7)