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

次のような意味ですか?

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 に答える
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 に答える
0

私はそれが次のようになると信じています:

fun1(fun2('lol'));

または難しい方法

var hi7 = fun2('笑')

fun1(hi7)

于 2012-12-18T03:52:21.387 に答える