为什么我从两个函数中得到两个不同的结果;利用闭包似乎没有什么不同

Why am I getting two different results from two functions that don't seem different at all taking advantage of closures?

本文关键字:两个 结果 没有什么不同 闭包 函数 为什么      更新时间:2023-09-26

我已经将数字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++;
  }

我得到了正确号码的提醒。

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

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

这与递增流有关。

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

如果您添加的功能是下一个,您将得到相同的结果

function add(){
  return ++i;
}

return i++;表示先返回i,然后进行增量。

顺便说一下,

return ++i;意味着您先进行增量,然后返回i。

当您调用alert(add())时,您将再次调用add(),并且由于i的当前值为5,因此i的值将增加到6,因为您已经调用add 5次了。如果在警报中的add()调用之前打印i,它仍然是5,但一旦在警报中调用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