2013-10-29 33 views
0

为什么这根本不起作用?“回调不是函数”和function.apply()

它说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

apply第一个参数是范围,而第二个参数数组。看起来你有这个,但argsRun(A,[1]);是只有一个参数(1)这将与a参数对齐,但你失踪该函数。另一方面,如果没有设置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); 
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; 
} 
0

apply()会将第一个参数,并在函数调用使用它作为this,并使用第二个参数作为参数传递给该呼叫。所以RUN2被调用像这样(其中<func>是你的匿名函数):

A(1, <func>); 

运行只传递一个参数在参数数组,1并调用它像这样:

A(1) 

什么你要做的是用这个替换您的运行(我认为):

function Run(func,args) 
{ 
    args.push(function() { document.write("blah")}); 
    // args is now [1, function(){...}] 
    return func.apply(this||window, args); 
} 
0

您需要的2数组长度为您Run()函数T o使用A()工作,因为它需要两个参数。你只有1个参数,如[1]。您需要[1, func],因此以下将是您的解决方案:

// the keyword this always exists 
function Run(func, args){ 
    args.push(func); 
    return func.apply(this, args || [function(){document.write("blah")}]); 
}