为什么这根本不起作用?
它说typeof(callback)= undefined。
function A(a,callback)
{
document.write(typeof(callback));
callback();
return a;
}
function Run(func,args)
{
return func.apply(this||window, args || [
function () { document.write("blah")}
]);
}
Run(A,[1]);
但是,如果不使用function.apply,它可以正常工作:
function Run2(func,arg)
{
return func(arg,
function () { document.write("blah")}
);
}
Run2(A,1);
请耐心等待我是JS的新手。
答案 0 :(得分:0)
问题实际上发生在A
函数中,callback
变量。如果您已编写如下A
函数,则不会收到此错误:
function A(a, callback) {
var type = typeof callback;
document.write(type);
if(type == "function") callback();//ensure callback is a function
return a;
}
答案 1 :(得分:0)
apply的第一个参数是范围,而第二个参数是参数数组。看来你有这个,但args
Run(A,[1]);
a
只是一个参数(1),它将与args
参数对齐,但你缺少功能。另一方面,如果未设置[ function ()... ]
,则您选择使用a
的单个参数创建一个数组,该数组将再次与||
对齐。
从它的外观来看,你试图合并/连接两个数组,实际上or
被用作比较运算符,或者更确切地说是func.apply(this||window,args.concat([function () { document.write("blah")}]));
赋值。
试试这个:
args.push(function () { document.write("blah")});
func.apply(this||window,args);
或
{{1}}
答案 2 :(得分:0)
apply()
接受第一个参数并在函数调用中将其用作this
,并使用第二个参数作为该调用的参数。所以Run2正在调用A这样(其中<func>
是你的匿名函数):
A(1, <func>);
Run只传递参数数组1
中的一个参数并调用它:
A(1)
你想要做的是用这个替换你的Run(我认为):
function Run(func,args)
{
args.push(function () { document.write("blah")});
// args is now [1, function(){...}]
return func.apply(this||window, args);
}
答案 3 :(得分:0)
你需要一个数组长度为2的Run()
函数才能使用A()
,因为它需要两个参数。你只有1个args,[1]
。您想要[1, func]
,因此以下是您的解决方案:
// the keyword this always exists
function Run(func, args){
args.push(func);
return func.apply(this, args || [function(){document.write("blah")}]);
}