为什么变量 n 不会被重置?function f1(){ var n=999; nAdd=function(){n+=1} function f2(){ alert(n); } return f2; } var result=f1(); result(); // 999 nAdd(); result(); // 1000 说明变量 n 是个全局变量,是不是在 f2 中变量 n 被提升为了全局变量?
1 回答
泛舟湖上清波郎朗
TA贡献1818条经验 获得超3个赞
因为js会给每个函数调用创建一个栈,函数内的函数也可以访问这个栈。
首先你能调用nAdd
,是因为你没加var
,等于是在函数调用时定义了一个全局作用域下的nAdd
,你加上var
再这么写会报错。
你的var result=f1();
调用了函数f1
,也就创建了一个栈,保存了n=999
,并返回了f2
。之后你再怎么调用result()
,其实都是在调用同一个f2
,而这个f2
引用的外部栈,自然还是第一次调用f1
时候创建的那个。同样的nAdd
虽然作用在全局,但访问的也是同一个栈内的数据。
所以,并不是你说的因为nAdd是全局变量,所以n被提升成全局变量,而是nAdd所指向的函数和你返回的那个闭包根本是在访问同一份数据。
你可以尝试着改写成
function f1(){
var n=999;
nAdd=function(){n+=1}
function f2(){
alert(n);
}
return f2;
}
f1()(); // 调用f1,创建了一个栈,栈内n=999,创建了一个匿名函数,返回了一个闭包。
nAdd(); // 调用了那个匿名函数
f1()(); // 又调用f1,又创建了一个栈,栈内n=999,创建了另一个匿名函数,返回了另一个闭包。
添加回答
举报
0/150
提交
取消