javascript
  • jquery
  • 2014-09-19 52 views -1 likes 
    -1

    如何通過JQuery的setTimeout調用帶參數的函數?如何用setTimeout回調參數調用函數?

    這個「作品」,但功能是直接調用:

    var successFunc = function(data, textStatus_ignored, jqXHR_ignored) { 
        alert("sf data='" + data + "', textStatus_ignored='" + textStatus_ignored + "', jqXHR_ignored='" + jqXHR_ignored + "', color_id='" + color_id + "'"); 
        $('#toggle_color_like_cell_' + color_id).html(data); 
    }; 
    var successFuncWithTimeout = function(data, textStatus_ignored, jqXHR_ignored) { 
        //alert("sfwt data='" + data + "', textStatus_ignored='" + textStatus_ignored + "', jqXHR_ignored='" + jqXHR_ignored + "', color_id='" + color_id + "'"); 
    
        setTimeout(successFunc(data, textStatus_ignored, jqXHR_ignored), 2000); 
    } 
    

    此等待兩秒鐘,但根據警報,所有的參數都undefined

    var successFuncWithTimeout = function(data, textStatus_ignored, jqXHR_ignored) { 
        //alert("sfwt data='" + data + "', textStatus_ignored='" + textStatus_ignored + "', jqXHR_ignored='" + jqXHR_ignored + "', color_id='" + color_id + "'"); 
    
        setTimeout(function(data, textStatus_ignored, jqXHR_ignored) { 
         alert("sf data='" + data + "', textStatus_ignored='" + textStatus_ignored + "', jqXHR_ignored='" + jqXHR_ignored + "', color_id='" + color_id + "'"); 
         $('#toggle_color_like_cell_' + color_id).html(data); 
        }, 2000); 
    } 
    

    回答

    1

    參數不要不需要傳遞給匿名函數,因爲它們已經在範圍之內。 (感謝this answer在Stack Overflow)

    var successFunc = function(data, textStatus_ignored, jqXHR_ignored) { 
        alert("sf data='" + data + "', textStatus_ignored='" + textStatus_ignored + "', jqXHR_ignored='" + jqXHR_ignored + "', color_id='" + color_id + "'"); 
        $('#toggle_color_like_cell_' + color_id).html(data); 
    }; 
    var successFuncWithTimeout = function(data, textStatus_ignored, jqXHR_ignored) { 
        //alert("sfwt data='" + data + "', textStatus_ignored='" + textStatus_ignored + "', jqXHR_ignored='" + jqXHR_ignored + "', color_id='" + color_id + "'"); 
    
        setTimeout(function() { 
         successFunc(data, textStatus_ignored, jqXHR_ignored); 
        }, 2000); 
    } 
    

    使用相同的概念,這也適用:

    var successFuncWithTimeout = function(data, textStatus_ignored, jqXHR_ignored) { 
        //alert("sfwt data='" + data + "', textStatus_ignored='" + textStatus_ignored + "', jqXHR_ignored='" + jqXHR_ignored + "', color_id='" + color_id + "'"); 
    
        setTimeout(function() { 
         alert("sf data='" + data + "', textStatus_ignored='" + textStatus_ignored + "', jqXHR_ignored='" + jqXHR_ignored + "', color_id='" + color_id + "'"); 
         $('#toggle_color_like_cell_' + color_id).html(data); 
        }, 2000); 
    } 
    
    +2

    或者,你可以使用'.bind()'的參數附加到一個回調。 – jfriend00 2014-09-19 15:54:24

    +0

    供參考。 'setTimeout'中的'return'具有誤導性,因爲它什麼都不做。這沒有錯,因爲它做錯了什麼。確實它是無害的。但是未來的開發人員會想知道爲什麼那個「return」會在那裏,並想知道是否有他們不知道的javascript特性。誤導性的代碼導致錯誤的假設導致錯誤。 – slebetman 2014-09-19 16:48:45

    +0

    @slebetman:固定。它只是返回'undefined',所以它應該被調用。 – aliteralmind 2014-09-19 17:06:55

    相關問題