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

javascript参数作用域问题和函数返回

javascript参数作用域问题和函数返回,javascript,recursion,scoping,Javascript,Recursion,Scoping,我的职能范围有两个小问题: 首先是自由论的范围界定。一切正常,直到它到达主“else”块,变量在返回到上一个递归时被重置。把自由作为一个全局变量解决了问题,但这不是应该怎么做 函数中的最后一个返回返回未定义。尽管我可以轻松地将这些变量记录到console.log中,但它们在所有情况下都是正确的,除了自由(如果不是全局的话)。我在这里没有看到任何异步行为,这让我很困惑它是如何工作的 函数getGroupposition,board,visited=[],group=[],liberties=0{

我的职能范围有两个小问题:

首先是自由论的范围界定。一切正常,直到它到达主“else”块,变量在返回到上一个递归时被重置。把自由作为一个全局变量解决了问题,但这不是应该怎么做

函数中的最后一个返回返回未定义。尽管我可以轻松地将这些变量记录到console.log中,但它们在所有情况下都是正确的,除了自由(如果不是全局的话)。我在这里没有看到任何异步行为,这让我很困惑它是如何工作的

函数getGroupposition,board,visited=[],group=[],liberties=0{ 设pointNotVisited=visited.ReduceAc,cur=>cur.x!==position.x | | cur.y!==position.y&&acc,true 如果没有人来访{ let Neights=GetNeightoursPosition,board 组位置 我的位置 让未访问的邻居=邻居。reduceac,cur=>{ 让neighbourVisited=visited.filterel=>el.x==cur.x&&el.y==cur.y 如果邻居访问了。长度>0{ 返回acc }否则{ 根据concatcur返回 } }, [] 未访问的邻居。forEachstone=>{ 如果stone.color==“空”{ 自由++ 普希斯通先生 }否则,如果stone.color!=position.color{ 普希斯通先生 } 返回getGroupstone、board、visited、group } }否则{ 返回{ “组”:组, “自由”:自由 } } } 您可以使用内部函数捕获闭包中的liberties变量,而不是尝试传递它。它看起来像这样:

function getGroup(position, board, visited = [], group = []) {
    var liberties = 0

    return myInnerFn(position, board, visited, group)

    function myInnerFn(position, board, visited, group) {
       // ... does grouping logic, recursively calling itself ...
    }
}
这里myInnerFn应该执行getGroups中的所有逻辑,只有liberties被移出。你可能也想考虑搬出其他的变量,我不确定你是否需要绕过董事会,访问或分组,一旦你有一个关闭。我还猜测,visited和group将不再需要作为外部函数的参数,它们可以像liberties一样创建为变量


通过使用两个函数,我们为变量的作用域引入了一个额外的级别,允许我们将变量从内部函数中推出来,而不必一直推到全局函数。

re 2。。。如果pointNotVisited被访问,那么函数显然返回undefined——因为在true块中没有return语句,为什么要返回getGroup。。。。在forEach里面?也许我会在这里给出一些上下文。这是一个在围棋中国棋盘游戏板上搜索一组相连石头的功能。我返回内部,因为对我来说,递归调用电路板上每个相邻元素上的函数是有意义的。但很有可能,我在我的逻辑中迷失了方向……我的观点是,在forEach中进行返回是多余的,因为返回值没有任何意义。但是,我不确定如何在邻居上调用getGroup?不幸的是,此解决方案导致“超出调用堆栈”错误。我不明白为什么没有代码就很难调试。我建议您创建一个JSFIDLE。内部函数需要递归地调用自身,而不是调用getGroup,第104行。