【问题标题】:Mutating variables inside a function - is it abuse?在函数内改变变量 - 它是滥用吗?
【发布时间】:2019-07-02 19:28:23
【问题描述】:

在我去找同事进行代码审查之前,我想知道最佳做法是什么。

我知道以下代码有效。我的问题是,JavaScript 是否普遍接受这种方式依赖闭包,或者这里是否存在我遗漏的问题?谢谢

编辑:更新了 sn-p 以更清楚地显示我想要实现的目标(更清晰、更易读的代码)

// All this is happening inside a function. Declared vars are not global.

var x, y, z;        // lots of variables to declare (to use in closures)
setupVars(true);    // lots of variables to setup
useVars();          // lots of variables to use

function setupVars(condition) {
    if(condition){
        x = 1;
        y = 2;
        z = 3;
    } else {
        x = 4;
        y = 5;
        z = 6;
    }
};

function useVars(){
    console.log(x);
    console.log(y);
    console.log(z);
}

【问题讨论】:

  • 请考虑发帖到:Code Review
  • @RandyCasburn 感谢您的关注。是的,这个 sn-p 是我真正在做的最简单的例子,结果证明是微不足道的。我已经更新了我的问题,以便更清楚。
  • 一般来说,过度使用全局变量往往是糟糕的编程风格,但它们有适当的时机。如果你使用它们,在函数中更新它们是正常的。
  • @Barmar 这些变量不是全局的,因为它们位于窗口对象上。所有这些代码都发生在另一个函数中。我只是希望这部分是可读的,并且没有太多的 if 语句。
  • 感谢您更新问题。这应该会通过您的代码审查,除非对使用 Globals 有硬性限制。您组织的编码风格指南应该告诉您这一点。另一种方法是使用 ES6 模块或 IIFE 围绕所有这些创建一个闭包。

标签: javascript scope closures


【解决方案1】:

在函数内部使用与全局变量同名的变量不是一个好的编码习惯。在上面的代码中,您应该考虑在函数内部重命名 x。

否则,如果函数如上图那样简单,你可以这样做

function modify(value){
    return modified_value;
}

【讨论】:

  • 如果你必须使用var x = initialize_x(true); var y = initialize_y(true); ...,这对于初始化大量变量会变得相当麻烦
猜你喜欢
  • 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
相关资源
最近更新 更多