【问题标题】:Initializing a variable as global versus local gives different results (JavaScript)将变量初始化为全局变量和局部变量会产生不同的结果(JavaScript)
【发布时间】:2020-12-06 23:34:48
【问题描述】:

我有一个关于将变量初始化为全局变量和局部变量的问题。对于变量 sum 作为全局变量(输出:16)与 sum 作为辅助函数 dfs 中的局部变量(输出:10),我得到了不同的结果。它与递归性质有关吗?

我将总和计算为每个整数的总和乘以它在嵌套数组中的深度。

测试用例是[[1,1],2,[1,1]] 和的正确答案是 10。

为什么在这种情况下第一个方法,声明一个全局变量是错误的?最佳做法是什么?

//global variable 

let sum = 0
function dfs(nestedList, depth){
    
    for(let i=0; i<nestedList.length; i++){
        if(nestedList[i].isInteger()) {
            sum += nestedList[i].getInteger()*depth
        }
        else {
           sum += dfs(nestedList[i].getList(),depth+1)
        }
    }
   return sum
    
}

var depthSum = function(nestedList) {
    console.log(sum)
    return dfs(nestedList,1)
};
local variable


function dfs(nestedList, depth){
    let sum = 0
    for(let i=0; i<nestedList.length; i++){
        if(nestedList[i].isInteger()) {
            sum += nestedList[i].getInteger()*depth
        }
        else {
           sum += dfs(nestedList[i].getList(),depth+1)
        }
    }
   return sum
    
}

var depthSum = function(nestedList) {
    console.log(sum)
    return dfs(nestedList,1)
};

【问题讨论】:

  • 如果变量是全局变量,它在整个程序中只存在一次。如果它是本地的,则每次调用dfs 都会存在一次。同样,当dfs 调用自己时,内部“实例”每次都会看到一个全新的私有sum 变量,只有他们自己可以访问。使用全局变量,您可以混合所有计算并添加一些东西两次。最佳做法始终本地化。
  • 这两个版本都不应该工作。任何地方都没有return 声明。
  • 每个函数的末尾是否应该有return sum;
  • 这取决于您实现的目标,还有局部变量控制台日志,因为您无法从外部访问总和值,所以它会以错误的方式传递给您,如果您看到一些值,则意味着您应该在全局中定义一些位置
  • Barmar 是对的,我错过了 dfs 函数中的 return 语句。感谢您建议保留变量本地 CherryDT!

标签: javascript arrays recursion nested global-variables


【解决方案1】:

递归是一种函数式遗产,因此将其与函数式风格一起使用通常会产生最佳效果。下面我们将dfs 视为纯表达式。对全局范围、中间状态和副作用的担忧消失了!

const dfs = (t = [], d = 0) =>
  Array.isArray(t)
    ? t.reduce((r, v) => r + dfs(v, d + 1), 0)
    : t * d
    
console.log(dfs([[1,1],2,[1,1]]))
// (1*2 + 1*2 + 2*1 + 1*2 + 1*2)
// 10 

console.log(dfs([1,[2,[3,[4]]]]))
// (1*1 + 2*2 + 3*3 + 4*4)
// 30 

【讨论】:

  • 消除副作用的好方法。 @感谢您展示了如何在 reduce 方法中使用递归。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多