簡體   English   中英

“回調不是函數”和function.apply()

[英]“callback is not the function” and 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新手。

該問題實際上是在帶有callback變量的A函數中發生的。 如果您編寫了如下的A函數,則不會收到此錯誤:

function A(a, callback) {
    var type = typeof callback;
    document.write(type);
    if(type == "function") callback();//ensure callback is a function
    return a;
}

apply的第一個參數是作用域,第二個參數是參數數組。 看來您有這個,但帶有Run(A,[1]); 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);

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);
}

為了使Run()函數使用A() ,您需要2的數組長度,因為它需要兩個參數。 您在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")}]);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM