js闭包问题?这段代码如何理解呢?为什么第二次调用result()变成1000了?

javascript闭包相关问题?为什么第二次调用result()变成1000了?
第二次调用result的时候还是会走var n=999;那输出的值为什么不是999?

function f1(){

    var n=999;

    nAdd=function(){n+=1}

    function f2(){  
      alert(n);  
    }

    return f2;

  }

  var result=f1();

  result(); // 999

  nAdd();
  
   result(); // 1000
阅读 3k
5 个回答

image.png
在这个位置看下result变成了什么。

result=f1();//这里已经给result重新赋值,值为f1()返回的结果,就是函数f2;
           // 所有这时候result = function(){alert(n)};
            
 //后面再怎么执行result,也不会重新var n;

result是f2函数,第二次调不会执行var n=999

你运行了nAdd()这个函数,执行了n+=1,所以结果打印出1000

第二次调用result的时候还是会走var n=999;

var n=999 是不会执行第二次的.

f1函数return f2 , 所以,你可以把var result = f1()理解为var result = f2,所以在第一次调用result()时,相当于调用了f2(),而f2和f1存在闭包关系,f2函数可以访问到f1函数的变量,故第一次alert(n)是999;然后调用nAdd()函数,n的值被赋值+1为1000,又由于闭包的原因使变量不会被销毁,所以第二次再调用result()的时候偶,依然是相当于再调用f2这个函数,而f2还是可以通过闭包访问f1的变量,此时n=1000,所以第二次的alert(n)就是1000了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题