1

为什么这根本行不通?

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

4 回答 4

0

apply()接受第一个参数并this在函数调用中使用它,并使用第二个参数作为该调用的参数。所以 Run2 像这样调用 A (<func>你的匿名函数在哪里):

A(1, <func>);

Run 只传递参数数组中的一个参数,1并像这样调用它:

A(1)

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

function Run(func,args)
{
    args.push(function () { document.write("blah")});
    // args is now [1, function(){...}]
    return func.apply(this||window, args);
}
于 2013-10-29T22:48:24.630 回答
0

您需要 Array 长度为 2 才能使您的Run()函数使用A(),因为它需要两个参数。您在 args 中只有 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")}]);
}
于 2013-10-29T23:11:56.917 回答
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;
}
于 2013-10-29T22:43:29.270 回答
0

apply的第一个参数是范围,而第二个是参数数组。看来你有这个,但args只有Run(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);
于 2013-10-29T22:46:06.880 回答