2

変数に格納されている関数を実行し、それにパラメータを渡そうとしています。ただし、.apply回線上でエラーが発生しています。Uncaught TypeError: Cannot call method 'apply' of undefined

フィドル: http: //jsfiddle.net/valamas/vzesm/

function target(msg)
{
    alert(msg);
}

function mainfunc (func)
{
    var args = new Array();
    for (var i = 1; i < arguments.length; i++)
        args.push(arguments[i]);

    console.log('args: ' + args);

    //-- different attempts
    window[func].apply(this, args);
    //window[func].apply(null, Array.prototype.slice.call(arguments, 1));
    //this[func].apply(this, Array.prototype.slice.call(arguments, 1));
}


$(function ()
{
    console.log('\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n');
    console.log('ready');
    mainfunc('target', 'hello,', 'there!');
});​
4

2 に答える 2

3

jsFiddleはJSをグローバルスコープに入れtargetないので、実際にはのプロパティではありませんwindow

このコードを追加すると、スクリプトが機能します。

window.target = target;

または、より明確に:

window.target = function() { ...

デモ: http: //jsfiddle.net/Blender/vzesm/3/

于 2012-09-27T06:45:29.223 に答える
2

これは、jsfiddleではjavascriptが別のスコープで実行されるためです。jQueryがロードされている場合、コードはFirebugコンソールで機能します。jsfiddleの場合、以下のように書き直す必要があります

target = function(msg)
{
    alert(msg);
}

function mainfunc (func)
{
    var args = new Array();
    for (var i = 1; i < arguments.length; i++)
        args.push(arguments[i]);

    console.log('args: ' + args);

    //-- different attempts
    window[func].apply(this, args);
    //window[func].apply(null, Array.prototype.slice.call(arguments, 1));
    //this[func].apply(this, Array.prototype.slice.call(arguments, 1));
}


$(function ()
{
    console.log('\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n');
    console.log('ready');
    mainfunc('target', 'hello,', 'there!');
});
于 2012-09-27T06:49:25.503 に答える