【问题标题】:Which scenario of Javascript closure is preferred?首选哪种 Javascript 闭包场景?
【发布时间】:2020-09-02 12:15:43
【问题描述】:

在什么情况下 counter1 更可取?在什么情况下计数器 2 会更好?

我知道在全局声明变量时可能无法预测,但是否存在比在函数内声明它更可取的情况?

// counter1 code
function counterMaker() {
  let count = 0;
  return function counter() {
    return count++;
  };
}


// counter2 code
let count = 10;

function counter2() {
  return count++;
}

【问题讨论】:

    标签: javascript variables scope closures counter


    【解决方案1】:

    如果您希望在其他地方引用 count 变量,您可以在外部范围内声明它,而不必增加计数:

    let count = 10;
    
    function counter2() {
      return count++;
    }
    
    
    counter2();
    counter2();
    console.log(count);

    如果count 变量在闭包内,并且闭包只公开返回的函数,则上述方法是不可能的 - 唯一的选择是调用返回的函数,即使您只想检查也会增加计数它的当前值。

    如果您想让counterMaker 的使用者和count 变量的代码读者清楚地知道count 只能由闭包中的counter 函数查看,那么第一种方法会很有用打算是私有的(并且在外部完全无法访问)。

    当您想要创建计数器的多个实例时,第一种方法也可以工作,而第二种方法则不会(除非您每次需要一个计数器时都重复一个计数器变量和函数,这是愚蠢的)。

    【讨论】:

      【解决方案2】:

      计数器 1 代码说明。

      // counter1 code
      function counterMaker() {
        let count = 0;
        return function counter() {
          return count++;
        };
      }
      

      在这里,您将一个函数返回给调用者。所以可以在调用者处做这样的事情。

      var c = counterMaker()
      c() //0
      c() //1
      c() //1
      var b = counterMaker()
      b() //0
      b() //1
      b() //1
      

      因为您尝试使用函数表达式时尝试封闭该函数和变量环境。所以你的增量功能不会暴露在外面。如果这是有道理的,那么你就会明白为什么要关闭以及在哪里关闭的全部简洁性。

      代码2说明

      // counter2 code
      let count = 10;
      
      function counter2() {
        return count++;
      }
      

      您正在尝试将增量函数公开到全局中,现在您将无法像上面的代码 1 那样创建多个实例。因此,每次调用函数 counter2 时,它只会增加什么。

      【讨论】:

        【解决方案3】:

        我认为在这种情况下,通过闭包访问变量比访问外部变量更可取。访问外部变量会产生副作用,你的函数变得依赖于它之外发生的变化,而且它们可能是不可预测的。或者,将来您要移动此函数,您仍需要监视此外部变量。我认为所有的外部依赖都应该通过参数传递给函数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-05-17
          • 2012-04-17
          • 1970-01-01
          • 2011-06-07
          • 1970-01-01
          • 2012-01-15
          • 1970-01-01
          • 2016-11-23
          相关资源
          最近更新 更多