对rs有点疑问
假如在rs=f1()后再调用一次f1,后面输出的值就都不会变了。不太明白n究竟是怎么保存的。
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Document</title>
</head>
<body>
</body>
<script>
function f1(){
var n=999;
nAdd=function(){
n++;
}
function f2(){
alert(n);
}
return f2;
}
var rs=f1();
rs();//999
nAdd();
rs();//1000
nAdd();
rs();//1001
f1();//直接调用一次f1
nAdd();
rs();//1001
nAdd();
rs();//1001
</script>
</html>0
收起
正在回答
2回答
同学你好, 因为两次调用f1的作用域是独立的。rs里面的n表示第一调用的f1函数作用域下的n值,所以第二次调用函数后, nAdd里面的n值是第二次调用的f1函数作用域下的n值。 所以nAdd里面的n和rs里面的不一样。 示例:

另, 可以打印在nAdd函数中执行n++前打印n的值,发现第二次调用f2之后,n的值为初始值,可以证明两次调用f1的作用域是独立, 示例:

效果图:

如果帮助到了你,欢迎采纳!
祝学习愉快~~~
好帮手慕慕子
2019-05-06 14:29:24
同学你好,闭包实现的就是在一个函数的内部可以访问另一个函数内部的变量, 示例:n保存在函数f1内部的,但是在f2函数内部可以访问到f1中的变量n,同学代码的运行可以参考下面代码中的注释
function f1() {
var n = 999;
nAdd = function() { n++;}
function f2() { alert(n); }
// 这里表示返回对f2的引用
return f2;
}
// f1()表示获取到f2的引用, 所以这里rs可以理解为就是f2
var rs = f1();
// 调用f2函数, 直接弹出999
rs(); //999
// 调用这个函数执行n加一,所以最有n的值为1000
nAdd();
// 调用这个函数再次弹出n的值1000
rs(); //1000
// 再次执行n加一操作
nAdd();
// 弹出n的值1001
rs(); //1001
// f1()这里只是获取到函数f2的引用, 可以理解为只是获取到了函数的名字, 但是没有调用
// 使用f1(), 会重新执行一次函数f1,让n的值重新为999
f1(); //直接调用一次f1
nAdd(); // n会执行加一操作
// 但是这里的rs还是上面保存的rs所以弹出的是1001
rs(); //1001
nAdd();// n会执行加一操作
rs(); //1001如果帮助到了你,欢迎采纳!
祝学习愉快~~~
HTML5&CSS3进阶与常用框架 2018
- 参与学习 315 人
- 提交作业 136 份
- 解答问题 626 个
如果你有H5、CSS3、JS基础,热爱前端并希望在前端应用方面不断进步,那就来吧,本路径为你带来的课程有HTML5进阶、CSS3进阶、JS面向对象、jQ基础、Less等,助你进一步提升前端开发技能
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧
0 星