[英]“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.