【问题标题】:closures difference from normal functions?闭包与正常功能的区别?
【发布时间】:2020-09-20 13:26:21
【问题描述】:

闭包可以访问外部函数、全局和内部函数范围。它是一个捆绑在一起的函数,并且能够返回一个函数。所以这是使用闭包构建的反例

function outerfunction() {
  var y = 10;
  return {
    add() {
      y = y + 1;
      console.log(y)
    },
    sub() {
      console.log(y)
      y = y - 1;

    },
    value() {
      return y;
    }
  }
}
const counter = outerfunction();
console.log(counter.value()); //10
counter.add(); //11
counter.add(); //12
console.log(counter.value()); //12
counter.sub(); //11
counter.sub(); //10
console.log(counter.value()); //10

这是反例的正常函数,即使在这个函数中也可以访问外部函数范围、全局范围和内部函数范围。那么区别是什么呢。这是下面的代码。

var counter = 10;

const add = () => {
  console.log(counter);
  counter++;
}

const sub = () => {
  console.log(counter);
  counter--;
}
console.log(counter); //10
add(); //11
add(); //12
console.log(counter); //12
sub(); //11
sub(); //10
console.log(counter); //10

如果我错了,请纠正。提前致谢

【问题讨论】:

  • 第一个是隐藏 y 变量以防止直接操作。

标签: javascript closures


【解决方案1】:

实际上每个函数都有一个对其父函数的环境记录的引用(所有变量都驻留在其中)。在您的第二个示例中,环境记录是全局范围,在第一个示例中,它是来自 outerFunction 调用的记录。所以没有区别,也没有闭包这样的东西。该术语仅用于描述结果行为。

【讨论】:

    【解决方案2】:

    不同之处在于您可以进行多个闭包,并且每个闭包都会保存自己的y 变量。

    function outerfunction() {
      var y = 10;
      return {
        add() {
          y = y + 1;
          console.log(y)
        },
        sub() {
          console.log(y)
          y = y - 1;
    
        },
        value() {
          return y;
        }
      }
    }
    const counter = outerfunction();
    console.log(counter.value()); //10
    counter.add(); //11
    counter.add(); //12
    
    const counter2 = outerfunction();
    console.log(counter2.value()); //10
    counter2.sub(); //9
    counter2.sub(); //8
    console.log(counter2.value()); //9

    当您使用全局变量时,只有一个计数器。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-26
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      • 2017-04-24
      相关资源
      最近更新 更多