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

vsmadaxz  于 2023-01-01  发布在  Java
关注(0)|答案(5)|浏览(180)

我对JavaScript编程比较陌生,我遇到了一个问题,我喜欢嵌套函数来保持有序,但是我如何从父函数中退出子函数呢?
示例:

function foo1() {
   function foo2() {
      //return foo1() and foo2()?
   }
   foo2();
}
bpsygsoo

bpsygsoo1#

  • 请参阅文件夹下的更新内容 *

不能,只能从子函数返回,然后从父函数返回。
我应该注意到,在您的示例中,没有任何东西调用foo2(在您编辑时,有些东西调用了)。让我们看一个更真实的示例(也是经常出现的示例):假设我们想知道一个数组中是否包含符合某个条件的条目,第一个stab可能是:

function doesArrayContainEntry(someArray) {
    someArray.forEach(function(entry) {
        if (entryMatchesCondition(entry)) {
            return true; // Yes it does           <-- This is wrong
        }
    });
    return false; // No it doesn't
}

你不能直接这么做,相反,你必须从匿名迭代器函数返回,以停止forEach循环,因为forEach没有提供这样做的方法,所以你使用some,它可以:

function doesArrayContainEntry(someArray) {
    return someArray.some(function(entry) {
        if (entryMatchesCondition(entry)) {
            return true; // Yes it does
        }
    });
}

如果对迭代器函数的任何调用返回true,则some返回true(并且停止循环);如果没有对迭代器的调用返回true,则返回false
同样,这只是一个常见的例子。
您在下面提到了setInterval,这告诉我您几乎肯定是在浏览器环境中这样做的。
如果是这样的话,那么play函数几乎可以肯定在你想做你所谈论的事情的时候已经返回了,假设游戏与用户有除了alertconfirm之外的任何交互,这是因为环境的异步特性。
例如:

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

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

yhxst69z

yhxst69z2#

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

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
    }
}
sh7euo9m

sh7euo9m3#

它只是说你不能在子函数中return父函数,但是我们可以做一个回调并让它发生。
function foo1(cb = () => null) {
   function foo2() {
      cb();
   }

   foo2();
}

foo1(() => {
    // do something
});
j8yoct9x

j8yoct9x4#

我们可以使用Promises来实现这一点:

const fun1 = async () => {
    const shouldReturn = await new Promise((resolve, reject) => {
        // in-game logic...
        resolve(true)
    })

    if(shouldReturn) return;
}

如果你想从父函数返回,那么就用true来解析

sbdsn5lh

sbdsn5lh5#

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

function play() {

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

相关问题