为了账号安全,请及时绑定邮箱和手机立即绑定

关于 javascript 闭包的问题?

关于 javascript 闭包的问题?

哈士奇WWW 2018-11-07 15:14:14
为什么变量 n 不会被重置?function f1(){    var n=999;    nAdd=function(){n+=1}    function f2(){      alert(n);    }    return f2;  }  var result=f1();  result(); // 999  nAdd();  result(); // 1000  说明变量 n 是个全局变量,是不是在 f2 中变量 n 被提升为了全局变量?
查看完整描述

1 回答

?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

因为js会给每个函数调用创建一个栈,函数内的函数也可以访问这个栈。

首先你能调用nAdd,是因为你没加var,等于是在函数调用时定义了一个全局作用域下的nAdd,你加上var再这么写会报错。

你的var result=f1();调用了函数f1,也就创建了一个栈,保存了n=999,并返回了f2。之后你再怎么调用result(),其实都是在调用同一个f2,而这个f2引用的外部栈,自然还是第一次调用f1时候创建的那个。同样的nAdd虽然作用在全局,但访问的也是同一个栈内的数据。

所以,并不是你说的因为nAdd是全局变量,所以n被提升成全局变量,而是nAdd所指向的函数和你返回的那个闭包根本是在访问同一份数据。

你可以尝试着改写成

function f1(){

    var n=999;

    nAdd=function(){n+=1}

    function f2(){

      alert(n);

    }

    return f2;

  }


  f1()(); // 调用f1,创建了一个栈,栈内n=999,创建了一个匿名函数,返回了一个闭包。

  nAdd(); // 调用了那个匿名函数

  f1()(); // 又调用f1,又创建了一个栈,栈内n=999,创建了另一个匿名函数,返回了另一个闭包。


查看完整回答
反对 回复 2018-12-14
  • 1 回答
  • 0 关注
  • 420 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信