我正在尝试执行存储在变量中的函数并将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!');
});
答案 0 :(得分:3)
jsFiddle没有将JS放入全局范围,因此target
实际上不是window
的属性。
添加此代码将使您的脚本正常工作:
window.target = target;
或者更明确:
window.target = function() { ...
答案 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!');
});