我对使用JavaScript进行编码比较陌生,而且我遇到了一个问题。我喜欢嵌套函数以保持有序,但是如何从子函数内部退出父函数?
示例:
function foo1() {
function foo2() {
//return foo1() and foo2()?
}
foo2();
}
答案 0 :(得分:6)
请参阅折叠
下的更新你做不到。您只能从子函数返回,然后从父函数返回。
我应该注意,在你的例子中,没有任何东西调用 (编辑时,有些东西)。让我们看一个更实际的例子(以及一个出现的例子):假设我们想知道数组是否包含符合某个条件的条目。第一次刺伤可能是: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
}
你不能直接这样做。相反,您必须以匿名迭代器函数的形式返回,以阻止forEach
循环。由于forEach
没有提供这样做的方法,因此您使用some
,这样做:
function doesArrayContainEntry(someArray) {
return someArray.some(function(entry) {
if (entryMatchesCondition(entry)) {
return true; // Yes it does
}
});
}
如果对迭代器函数的任何调用返回some
,则 true
返回true
(并停止循环);如果没有对迭代器的调用返回false
,则返回true
。
同样,这只是一个常见的例子。
您在下面提到了setInterval
,它告诉我您几乎肯定会在浏览器环境中这样做。
如果是这样的话,假设游戏与play
以外的用户进行了任何互动,那么您的alert
功能几乎肯定已经返回到您想要做的事情。 {1}}。这是因为环境的异步性质。
例如:
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);
}
几乎会立即运行并返回。然后浏览器等待您连接的事件发生,如果是,则触发play
中的代码。但是handleEvent
已经很久了。
答案 1 :(得分:2)
记下父函数是否也应该返回。
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
}
}
答案 2 :(得分:0)
根据你的评论,这样的事情可能会成为一个主要的游戏循环。
function play() {
var stillPlaying = true;
while(stillPlaying) {
... play game ...
stillPlaying = false; // set this when some condition has determined you are done
}
}