2012-08-09 390 views
0

我試圖編寫一個函數和毫秒數作爲參數的通用函數,並將其設置爲setTimeout函數。我試着像javascript - 將回調函數作爲參數傳遞給函數

$("#Delay").click(function() { 
    delayCallBack(someFunction(a, b), 100); 
}); 

在delayCallBack功能

function delayCallBack(event, time) { 
    setTimeout(function() { 
     event(); 
    }, time); 
}; 

但是這是行不通的,丟了我的JavaScript錯誤。有人可以幫助我做這種儀式嗎?

+0

可能不會幫你實際上是調用'someFunction(A,B)'當你認爲你發送給它的參考......你究竟是什麼做它發送它的**結果** – freefaller 2012-08-09 09:20:10

+0

在a和b定義的範圍內? – 2012-08-09 09:23:23

+0

你正在得到什麼確切的錯誤? – 2012-08-09 09:27:32

回答

3

更換

$("#Delay").click(function() {delayCallBack(someFunction(a,b), 100);}); 

隨着

$("#Delay").click(function() {delayCallBack(function(){someFunction(a,b)}, 100);}); 

第一行執行someFunction(a,b)而不是第二行所做的,傳遞的引用來執行的功能。

+0

你擊敗了我,+1 – freefaller 2012-08-09 09:22:39

2

()調用一個函數,所以你調用函數而不是傳遞它。通過該功能,像正常變量:

$("#Delay").click(function() { 
    delayCallBack(someFunction, 100); 
}); 

你的函數可以被清理一點點......然後再它只是從直接調用setTimeout沒有什麼不同..

function delayCallBack(callback, time) { 
    setTimeout(callback, time); 
} 

要傳遞參數ab,您可以使用現有函數創建一個新函數,該函數部分應用ab,然後將它傳遞:

$("#Delay").click(function() { 
    delayCallBack(someFunction.bind(null, a, b), 100); 
}); 

更多.bind。演示:http://jsfiddle.net/Pd5JZ/2/

+0

a和b怎麼樣? – 2012-08-09 09:24:21

+0

@JørgenFogh不知道它們是什麼,OP可能從'a'和'b'中得到'ReferenceError',所以我把它們排除了。但是因爲他沒有說出他有什麼錯誤,所以還不清楚。 – Esailija 2012-08-09 09:25:24

0

這個問題在JavaScript中有一個令人驚訝的棘手問題,因爲您傳入值ab。考慮傑拉德塞克斯頓的解決方案

$("#Delay").click(function() { 
    delayCallBack(function() { 
         someFunction(a,b); 
        }, 100); 
}); 

什麼代碼確實取決於其中ab定義和處理程序後勢必會發生什麼給他們。假設我們把它放在上下文中:

$(function() { 
    var a, b; 
    a = b = 5; 
    $("#Delay").click(function() { 
     delayCallBack(function() { 
          someFunction(a,b); 
         }, 100); 
    }); 
    a = b = 7; 
} 

然後someFunctiona=b=7,不a=b=5被調用。如果您需要第一個值,則必須在綁定處理程序時複製值。像這樣:

$(function() { 
    var a, b; 

    function bind(a, b) { 
     $("#Delay").click(function() { 
      delayCallBack(function() { 
           someFunction(a,b); 
          }, 100); 
     }); 
    } 

    a = b = 5; 
    bind(a, b); 
    a = b = 7; 
} 
0

我也得到了同樣的錯誤:setTimeout調用(缺少引號周圍的參數?)。 傑拉德塞克斯頓的解釋是正確的。

正確的代碼應該是

$("#Delay").click(function() {delayCallBack(function(){someFunction(a,b)}, 100);}); 
相關問題