“回调不是函数”和function.apply()

时间:2013-10-29 22:37:47

标签: javascript callback

为什么这根本不起作用?

它说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的新手。

4 个答案:

答案 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")}]);
}