每当我尝试在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
}
}
}
答案 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)