Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.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 - Fatal编程技术网

从子函数内部从父函数返回-Javascript

从子函数内部从父函数返回-Javascript,javascript,Javascript,我对JavaScript的编码相对来说比较陌生,我遇到了一个问题。我喜欢嵌套函数以保持有序,但是如何从子函数内部退出父函数呢 例如: function foo1() { function foo2() { //return foo1() and foo2()? } foo2(); } 请参见折叠下的更新 你不能。只能从子函数返回,然后从父函数返回 我应该注意到,在您的示例中,从来没有调用过foo2(在编辑时,有些东西确实调用了)。让我们看一个更真实的例子(经常出现

我对JavaScript的编码相对来说比较陌生,我遇到了一个问题。我喜欢嵌套函数以保持有序,但是如何从子函数内部退出父函数呢

例如:

function foo1() {
   function foo2() {
      //return foo1() and foo2()?
   }
   foo2();
}
请参见折叠下的更新

你不能。只能从子函数返回,然后从父函数返回

我应该注意到,在您的示例中,从来没有调用过
foo2
(在编辑时,有些东西确实调用了)。让我们看一个更真实的例子(经常出现的例子):假设我们想知道数组是否包含与某个条件匹配的条目。第一种可能是:

function doesArrayContainEntry(someArray) {
    someArray.forEach(function(entry) {
        if (entryMatchesCondition(entry)) {
            return true; // Yes it does           <-- This is wrong
        }
    });
    return false; // No it doesn't
}
some
返回
true
(并停止循环),如果对迭代器函数的任何调用返回
true
;如果没有对迭代器的调用返回
true
,则返回
false

同样,这只是一个常见的例子


您已经参考了下面的
setInterval
,它告诉我您几乎肯定是在浏览器环境中这样做的

如果是这样,你的
play
功能几乎肯定在你想做你正在谈论的事情的时候已经返回了,假设游戏除了
alert
confirm
之外还有任何与用户的交互。这是因为环境的异步性质

例如:

function play() {
    var health = 100;

    function handleEvent() {
        // Handle the event, impacting health
        if (health < 0 {
            // Here's where you probably wanted to call die()
        }
    }

    hookUpSomeEvent(handleEvent);
}
函数播放(){
var健康=100;
函数handleEvent(){
//处理事件,影响健康
如果(健康状况<0{
//这是你可能想称之为die()的地方
}
}
hookUpSomeEvent(handleEvent);
}

问题是,
play
几乎会立即运行并返回。然后浏览器会等待您连接的事件发生,如果发生,它会触发
handleEvent
中的代码。但是
play
早就返回了。

请注意父函数是否也应该返回

function foo1() {
    bool shouldReturn = false;

    function foo2() {
        shouldReturn = true;    // put some logic here to tell if foo1() should also return 
        return;
    }

    if (shouldReturn) {
        return;
    } else {
        // continue
    }
}

根据你的评论,像这样的东西可以作为一个主要的游戏循环

function play() {

var stillPlaying = true;
    while(stillPlaying) {
     ... play game ...
      stillPlaying = false; // set this when some condition has determined you are done
    }
}

你对我能做的事情有什么建议吗?这取决于我们对“return”的理解。引发异常会传播。返回bool(true/false),这取决于函数是否成功,然后让父函数决定下一步要做什么。我不需要设置一个setInterval或一些东西来持续检查吗?@user3025700:如果你正在做类似的事情,你的
播放将已经返回。如果没有更多示例代码,很难想象原因任何人都会想试试这个。这个示例代码甚至没有编译。我正在制作一个游戏…我所有的游戏代码都在“play()”中,在play中我希望函数“die()”停止“play()”。我正在制作一个游戏…我所有的游戏代码都在“play()”中,在play中我希望函数“die()”停止“play()”如果您的游戏涉及到与外界的交互,那么当您决定某些东西应该“消亡”时,
play
似乎不太可能仍在运行,因为大多数JavaScript环境(包括浏览器)都采用异步方式处理用户发起的事件。这个游戏在什么环境下运行?这不能生成一个使浏览器崩溃的循环吗?
function play() {

var stillPlaying = true;
    while(stillPlaying) {
     ... play game ...
      stillPlaying = false; // set this when some condition has determined you are done
    }
}