Javascript函数(来自闭包)

时间:2018-05-19 11:26:51

标签: javascript closures

我有这个代码(如下所示),当我写c1 = count();时,我调用函数count()(我目前的理解),所以闭包将在第一次调用后记住c = 1。

稍后,如果我调用c1(),结果为1.如果我通过编写c1=count()调用此函数一次,c已增加到1?该值不应该是2?

function count() {
    var c = 0 ;
    return function() {
        c += 1 ;
        return c ;
    };
}

如果没有,

为什么当我写这个函数时,我的输出是'A!'?这意味着通过编写var x=a()我调用函数,应该在上面的函数中使用相同的逻辑,不应该吗?

function a() {
  alert('A!');
  return function() {
    alert('B!');
  };
};
var x = a();

3 个答案:

答案 0 :(得分:4)

这是你的功能,

function count() {  
 var c = 0 ;
 return function() {
   c += 1 ;
   return c ;
 };
}

第一次调用函数count()时,它会做两件事,

  1. 初始化var c
  2. 返回一个函数,该函数包含对在外部作用域中声明的变量c的引用。 (了解关闭的更多信息:这是一篇很好的文章https://medium.com/javascript-scene/master-the-javascript-interview-what-is-a-closure-b2f0d2152b36
  3. 现在返回count()的值,即将返回函数赋给变量c1。 c1是一个函数,当你调用增量变量c的值时。

    当你这样做时,

    var c1 = count(); // c = 0 & a function is assigned to c1
    c1(); // c + 1 i.e 1
    c1(); // c = 2
    

    依旧......

    现在下一个案例,

    function a() {
      alert('A!');
      return function() {
        alert('B!');
      };
    };
    var x = a();
    

    致电a()

    1. alert('A!')
    2. 返回一个函数并将其分配给x;
    3. 下次当您致电x()时,它始终会alert('B!')

      希望这有帮助。

答案 1 :(得分:1)

当您致电count时,您将从[{1}}中存储的count返回内部函数:

c1

但当时你还没有调用返回的函数,因此return function() { c += 1 ; return c ; }; 仍为c

当您现在通过编写0调用存储在c1中的返回函数时,c1会增加c,因此第一次调用1你得到c1



1




答案 2 :(得分:-1)

function count() {

   var c = 0 ;
   return function() {
     c += 1 ;
     return c ;
    };
}

每次调用该函数时,都将值设置为0 - 所以它总是返回一个。而是将其称为增量计数,并将值递增到:

function incrementCount(valToInc) {
   return valToInc += 1;
}

incrementCount(4); //returns 5