猿问

函数与闭包问题

程序代码如下:


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呢?


蝴蝶刀刀
浏览 556回答 4
4回答

红糖糍粑

nAdd 是全局变量重复赋值会覆盖 所以let a1 = t();let a2 = t();a2里的nAdd覆盖了a1的nAddn是局部变量,这里nAdd里的n++是a2的n

慕妹3146593

let nAdd;let t = () => {    let n = 99;    nAdd = () => {        n++;    };    let t2 = () => {        console.log(n);    };    return t2;};let a1 = t();//Alet a2 = t();//BnAdd();//Ca1(); //D   //99a2(); //E   //100A) 执行后 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没有任何修改,还是 99E) a2_t2 所处的环境中的t已经通过B_nAdd被修改了,是 100

素胚勾勒不出你

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

心有法竹

因为你的nadd加的变量只是a2对应的,在给a2 = t();之后,nadd的值已经改变了,不再是指向a1的nadd
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答