程序代码如下: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
慕妹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
素胚勾勒不出你
TA贡献1827条经验 获得超9个赞
添加回答
举报
0/150
提交
取消