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 回答