鍍金池/ 問答/HTML/ 函數(shù)與閉包問題

函數(shù)與閉包問題

程序代碼如下:

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()結(jié)果的值用閉包的原理可以解釋的通,因?yàn)閚Add在函數(shù)外面,在函數(shù)里面引用,nAdd引用了變量n,導(dǎo)致n不會(huì)被回收,也就是閉包里面保存局部變量的作用??墒菫槭裁碼1一直是返回99呢?

回答
編輯回答
不二心

nAdd 是全局變量重復(fù)賦值會(huì)覆蓋 所以

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

a2里的nAdd覆蓋了a1nAdd
n是局部變量,這里nAdd里的n++a2n

2017年8月12日 10:00
編輯回答
安若晴

n是在函數(shù)內(nèi)申明的,是局部變量,兩個(gè)函數(shù)中的n指向不同的內(nèi)存。nAdd是全局變量,你運(yùn)行兩次t(),第二次把第一次覆蓋了,所以a1里的n++沒有運(yùn)行。

2018年8月18日 02:35
編輯回答
落殤

因?yàn)槟愕膎add加的變量只是a2對應(yīng)的,在給a2 = t();之后,nadd的值已經(jīng)改變了,不再是指向a1的nadd

clipboard.png

2017年12月17日 09:00
編輯回答
局外人

重復(fù)賦值導(dǎo)致nAdd切斷了與a1里面n的聯(lián)系,現(xiàn)在nAdd里面的n關(guān)聯(lián)的是a2函數(shù)堆棧里面的n。您的意思是這樣嗎?

2018年4月20日 21:21
編輯回答
我以為
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) 執(zhí)行后 nAdd被賦值-命名為(A_nAdd), 并且a1指向t內(nèi)部定義的函數(shù)t2-命名為(a1_t2)
B) 執(zhí)行后 nAdd被重新賦值-命名為(B_nAdd),并且a2指向t內(nèi)部定義的函數(shù)t2-命名為(a2_t2),a1_t2 和 a2_t2是2個(gè)完全不同的函數(shù)對象
C) 執(zhí)行的是B_nAdd,此時(shí)的的n值為100,n所在的上下文環(huán)境和a2_t2相同

D) a1_t2 所處的環(huán)境中的t沒有任何修改,還是 99
E) a2_t2 所處的環(huán)境中的t已經(jīng)通過B_nAdd被修改了,是 100

2017年4月6日 18:05