function f1(){
var n=999;
nAdd=function(){
n+=1
}
function f2(){
alert(n);
}
return f2;
}
var result1=f1();
var result2=f1();
result1(); // 999
nAdd();
result1(); // 999
result2(); //1000
为什么输出分别是999,999,1000而不是999,1000,1000
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
因为
n
不是全局变量,每次调用f1()
都会创建独立的n
;那么显然,第二次调用
var result2=f1();
之后,nAdd
里的n
就只对result2
负责了,于是result1()
仍然打印出来的是她自己作用域里的那个999
两点很关键: n是局部变量,nAdd是全局变量!此时,上面的代码应该可以写成这样:
这就是一个闭包,在创建result1的时候,n是999,并且独立属于result1的闭包里面,并且第一次给nAdd赋值了,这时候,nAdd里面N 指向result1闭包里面的n。
紧接着, 创建了result2,此时,由于n是局部变量,会创建新的n,于是,nAdd被再次赋值,并且,此时nAdd里面的n指向的是result2里面的n了。
所以,运行nAdd改变的仅仅是result2闭包里面的n值!
希望有所帮助!
第二次运行
f1()
的时候,覆盖了nAdd
的定义,所以nAdd
是在第二次运行的f1()
中定义的,所以会改变result2
的输出。好好的闭包居然弄了个全局,无法理解这样的运用。