Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 自引用回调_Javascript_Jquery_Callback_Closures - Fatal编程技术网

Javascript 自引用回调

Javascript 自引用回调,javascript,jquery,callback,closures,Javascript,Jquery,Callback,Closures,问题已解决,欢迎对最佳实践提出任何意见 我正在开发一款JS(和JQuery)战舰游戏,它有“dropBoat”功能,允许用户将战舰放置在一个棋盘上。这个函数的细节并不重要(它将board和boatLength作为参数),但是我无法重用它来放置第二条船 我正在努力实现这一系列事件: dropBoat函数调用-->dropBoat函数调用-->dropBoat函数调用-->StartPlay函数。这是我当前尝试的草图 var dropBoat = function(board, length, ca

问题已解决,欢迎对最佳实践提出任何意见

我正在开发一款JS(和JQuery)战舰游戏,它有“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();
        }
    }
}
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()();
        }
    }
}

您不希望多次绑定事件处理程序。将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]);
}
var dropBoat=功能(板,长度){
//函数代码在这里
}
var board1=新战舰(),
board2=新战舰(),
船=[1,1,1,2,2,3,5],
B
对于(b=0;b<0.length;b++){
吊船(船上1艘,船[b]);
升降船(船上2艘,船[b]);
}

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

function doSomething(callback) {
     // ...

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

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

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

查看此答案以了解更多详细信息:

这似乎有效

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

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

很抱歉,这段代码没有太多意义。啊,是的,我不想在解释如何根据按键显示轮廓、旋转和放置不同长度的船只时陷入困境。我可能会以古怪/低效的方式做很多事情,因为我对编程很陌生。这没问题。同样好的是,您尝试减少不相关的部分,而不是像许多其他新手那样删除整个代码。显示您的代码很重要,但解释您的意图更为重要。您的问题就是一个例子。谢谢。我将尝试改进事件处理程序的使用。你是对的,一个循环将是一个更简单的解决方案,但我希望用户有一个更互动的体验,通过放置带有键盘箭头键的船(对不起,我没有在问题中指定)。你可以做到这一点。只需在keyup处理程序中调用
dropBoat()
dropBoat()
真的不需要自己调用。谢谢,我需要提高对回调的理解。这是一个有用的例子和链接。