自引用回调

时间:2015-04-10 05:39:17

标签: javascript jquery callback closures

问题已解决,欢迎任何关于最佳做法的评论

我正在研究JS(和JQuery)Battleships游戏,并具有“dropBoat”功能,允许用户将船放在棋盘上。这个函数的细节并不重要(它需要board和boatLength作为参数)但是我无法重复使用它来放置第二艘船。

我正在努力实现这一系列事件:

dropBoat函数调用 - > dropBoat函数调用 - > dropBoat函数调用 - >调用StartPlay函数。这是我当前尝试的草图。

var dropBoat = function(board, length, callback){
    //function code here
    $(document).keydown(function(e){
        if(e.which == "38"){
            //more function code here
            callback()
        }
    }
}

var dropThirdBoat = dropBoat(board1, 3, startPlay);
var dropSecondBoat = dropBoat(board1, 2, dropThirdBoat);
var dropFirstBoat = dropBoat(board1, 3, dropSecondBoat)();

这似乎有用

var dropThirdBoat = function(){
    dropBoat(board1, 3, startPlay);
}
var dropSecondBoat = function(){
    dropBoat(board1, 2, dropThirdBoat);
}
var dropFirstBoat = dropBoat(board1, 3, dropSecondBoat);
    var dropBoat = function(board, length, callback){
    //function code here
    $(document).keydown(function(e){
        if(e.which == "38"){
            //more function code here
            callback();
        }
    }
}

3 个答案:

答案 0 :(得分:1)

您不想多次绑定事件处理程序。将keydown处理程序移出功能代码并移至顶层。

$(document).keydown(function (e) {
    if (e.which == "38"){
        //more function code here
        callback();
    }
}

话虽如此,如何简单地使用循环?

var dropBoat = function(board, length){
    //function code here
}

var board1 = new BattleshipBoard(),
    board2 = new BattleshipBoard(),
    boats = [1, 1, 1, 2, 2, 3, 5],
    b;

for (b = 0; b < boats.length; b++) {
    dropBoat(board1, boats[b]);
    dropBoat(board2, boats[b]);
}

答案 1 :(得分:1)

您需要将回调声明为参数,并且可以使用参数名称直接调用它。

function doSomething(callback) {
     // ...

    // Call the callback
    callback('stuff', 'goes', 'here');
}

function foo(a, b, c) {
    // your operations
    alert(a + " " + b + " " + c);
}

doSomething(foo);
像这样,你需要调用你的回调函数。

查看此答案以获取更多详细信息:

https://stackoverflow.com/a/2190872/4763053

答案 2 :(得分:0)

这似乎有用

var dropThirdBoat = function(){
    dropBoat(board1, 3, startPlay);
}
var dropSecondBoat = function(){
    dropBoat(board1, 2, dropThirdBoat);
}
var dropFirstBoat = dropBoat(board1, 3, dropSecondBoat);
var dropBoat = function(board, length, callback){
   var storeCall = storeVal(callback);
   //function code here
    $(document).keydown(function(e){
        if(e.which == "38"){
            //more function code here
            storeCall()();
        }
    }
}

定义函数而不是变量会阻止代码立即执行。