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

函数与闭包问题

函数与闭包问题

蝴蝶刀刀 2019-03-08 16:09:42
程序代码如下:let nAdd;let t = () => {    let n = 99;    nAdd = () => {        n++;    };    let t2 = () => {        console.log(n);    };    return t2;};let a1 = t();let a2 = t();nAdd();a1();    //99a2();    //100a2()结果的值用闭包的原理可以解释的通,因为nAdd在函数外面,在函数里面引用,nAdd引用了变量n,导致n不会被回收,也就是闭包里面保存局部变量的作用。可是为什么a1一直是返回99呢?
查看完整描述

4 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

nAdd 是全局变量重复赋值会覆盖 所以


let a1 = t();

let a2 = t();

a2里的nAdd覆盖了a1的nAdd

n是局部变量,这里nAdd里的n++是a2的n


查看完整回答
反对 回复 2019-03-13
?
慕妹3146593

TA贡献1820条经验 获得超9个赞

let nAdd;

let t = () => {

    let n = 99;

    nAdd = () => {

        n++;

    };

    let t2 = () => {

        console.log(n);

    };

    return t2;

};


let a1 = t();//A

let a2 = t();//B


nAdd();//C

a1(); //D   //99

a2(); //E   //100

A) 执行后 nAdd被赋值-命名为(A_nAdd), 并且a1指向t内部定义的函数t2-命名为(a1_t2)

B) 执行后 nAdd被重新赋值-命名为(B_nAdd),并且a2指向t内部定义的函数t2-命名为(a2_t2),a1_t2 和 a2_t2是2个完全不同的函数对象

C) 执行的是B_nAdd,此时的的n值为100,n所在的上下文环境和a2_t2相同


D) a1_t2 所处的环境中的t没有任何修改,还是 99

E) a2_t2 所处的环境中的t已经通过B_nAdd被修改了,是 100


查看完整回答
反对 回复 2019-03-13
?
素胚勾勒不出你

TA贡献1827条经验 获得超9个赞

n是在函数内申明的,是局部变量,两个函数中的n指向不同的内存。nAdd是全局变量,你运行两次t(),第二次把第一次覆盖了,所以a1里的n++没有运行。


查看完整回答
反对 回复 2019-03-13
?
心有法竹

TA贡献1866条经验 获得超5个赞

因为你的nadd加的变量只是a2对应的,在给a2 = t();之后,nadd的值已经改变了,不再是指向a1的nadd

https://img1.sycdn.imooc.com//5c88bb36000167a904250650.jpg

查看完整回答
反对 回复 2019-03-13
  • 4 回答
  • 0 关注
  • 555 浏览
慕课专栏
更多

添加回答

举报

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