1

每当我尝试在 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

4 回答 4

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]);
        }
    }    
}​
于 2012-12-18T03:50:45.573 回答
1

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

functions[i].call(this, arguments[j])
于 2012-12-18T03:55:29.397 回答
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?"]);
于 2012-12-18T03:59:57.940 回答
0

我相信它会是这样的:

乐趣1(乐趣2('大声笑'));

或艰难的方式

var hi7 = fun2('大声笑')

乐趣1(hi7)

于 2012-12-18T03:52:21.387 回答