执行窗口[func] .apply(this,args)

时间:2012-09-27 06:42:39

标签: javascript dynamic

我正在尝试执行存储在变量中的函数并将params传递给它。但是,在.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!');
});​

2 个答案:

答案 0 :(得分:3)

jsFiddle没有将JS放入全局范围,因此target实际上不是window的属性。

添加此代码将使您的脚本正常工作:

window.target = target;

或者更明确:

window.target = function() { ...

演示:http://jsfiddle.net/Blender/vzesm/3/

答案 1 :(得分: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!');
});