函数与闭包问题

specialCoder
  • 2.1k

程序代码如下:

let nAdd;
let t = () => {
    let n = 99;
    nAdd = () => {
        n++;
    };
    let t2 = () => {
        console.log(n);
    };
    return t2;
};

let a1 = t();
let a2 = t();

nAdd();
a1();    //99
a2();    //100

a2()结果的值用闭包的原理可以解释的通,因为nAdd在函数外面,在函数里面引用,nAdd引用了变量n,导致n不会被回收,也就是闭包里面保存局部变量的作用。可是为什么a1一直是返回99呢?

回复
阅读 1.9k
5 个回答
李十三
  • 13.3k

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

let a1 = t();
let a2 = t();

a2里的nAdd覆盖了a1nAdd
n是局部变量,这里nAdd里的n++a2n

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

无风
  • 649

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

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

clipboard.png

重复赋值导致nAdd切断了与a1里面n的联系,现在nAdd里面的n关联的是a2函数堆栈里面的n。您的意思是这样吗?

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