闭包:这个特定的部分如何工作?

时间:2014-05-15 05:10:17

标签: javascript

我正在努力解决这个问题。通过查看下面的内容,我不明白当我在控制台上输入“counter”等于以下内容时。如何获取这段代码?这是如何工作的?

function(val) {
  count += val;
  return console.log(count);
};

守则

var incrementer = function(initialValue) {
  var count = initialValue;

  return function(val) {
    count += val;
    return console.log(count);
  };
};

var counter = incrementer(5);

counter(3);
counter(1);

3 个答案:

答案 0 :(得分:1)

由于incrementer会返回一个函数,这实际上意味着一旦counter填充incrementer(5),它就会成为对incrementer返回的函数的引用那个计数器变量在那个时候看起来像这样:

counter = function(val) {
    count += val;
    return console.log(count);
};

验证这一点:

console.log(counter);

因此,对counter的后续调用将增加count

的值

注意:变量count存在于incrementer的范围内,只能因为counter引用的函数是在该范围内创建而被访问。

答案 1 :(得分:0)

增量器是一个返回函数的函数。计数器等于增量函数的返回值,增量函数是一个函数,它接收一个值并递增最初在增量器(5)中传递的值。

调用incrementmenter(5)本质上设置初始状态,但返回可以使用您创建的计数器指针(变量)调用的函数。

这种解释是否有意义?

var counter = incrementer(5); //initializes the "initial value" and returns a function, thus setting "counter" equal to a function.. aka function pointer

counter(3);  //invokes the function that increments the value by 3 - hence 8

答案 2 :(得分:0)

在javascript中,函数会记住声明它的上下文。

解释闭包的最快方法。

因此,如果创建一个返回函数的函数,返回的函数将“关闭”外部函数的变量,因此返回的函数具有状态。

由于count已在返回函数的“parent”范围内声明,因此返回的函数将记住其内部变量count指的是增量器的变量计数。