为什么我从两个完全没有利用闭包的函数中得到两个不同的结果?

时间:2015-12-18 06:24:33

标签: javascript

我已将数字0指定给函数外的变量。我正在使用这个变量来利用闭包,因为我还创建了一个简单的函数,它返回变量,仅仅是为了跟踪我调用函数的次数。我调用该函数5次,最后将调用的函数传递给alert函数。令人困惑的是,如果我增加变量然后返回变量,我得到的警报消息是“6”而不是“5”,这是我调用函数的次数,但是,如果我增加变量并返回它同时,意味着变量增量是return语句的一部分,我得到了我在警告消息中调用函数的正确次数。为什么我会得到不同的结果?我用作我的计数器的函数外部的变量被赋予数字0.创建全局执行上下文并保持此变量对吗?除此之外,我的5个调用创建了5个执行上下文,每次,新增加的变量都存在并保留在内存中,以便下一次调用增量。 “6”来自哪里? 这是我的代码,它产生6作为调用函数的次数:

var i = 0; 

function add() {
   i++;
   return i;
}

add();
add();
add();
add();
add();

alert(add());

只需这样做:

  function add() {
   return i++;
  }

我收到了正确的号码警报。

4 个答案:

答案 0 :(得分:1)

在第一种情况下,在递增后返回值,在递增之前返回第二个值

尝试alert ( i );而不是alert( add() );,您将获得相同的值

答案 1 :(得分:1)

这与增加流量有关。

预增量(++ i)将值i加1,然后返回i,相反,i ++返回i然后加1。 在第一种情况下,您在单独的语句中增加值,因此,前或后增量不起任何作用,在第二个前或后增量播放角色中,因为函数首先返回i而不是增量。

如果你的函数add是下一个

,你会得到相同的结果
function add(){
  return ++i;
}

答案 2 :(得分:0)

return i++;表示你首先返回我然后再做增量。

顺便说一下,

return ++i;表示你执行incrementfirst然后返回i。

答案 3 :(得分:0)

当你调用alert(add())时,你再次调用add()并将i的值增加到6,因为i的当前值是5,因为你已经调用了add 5次。如果你在add()之前打印我的警告仍然是5,但是一旦你在alert中调用add()它就会变成6,因为你正在调用方法调用。

    var i = 0;

    function add() {
        i++;
        return i;
    }

    add();
    add();
    add();
    add();
    add();

   // alert(i +' '+ add()); //5  6
    alert(add() +' '+ i); //6  6