对rs有点疑问

对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>


正在回答

登陆购买课程后可参与讨论,去登陆

2回答

同学你好, 因为两次调用f1的作用域是独立的。rs里面的n表示第一调用的f1函数作用域下的n值,所以第二次调用函数后, nAdd里面的n值是第二次调用的f1函数作用域下的n值。 所以nAdd里面的n和rs里面的不一样。 示例:

http://img1.sycdn.imooc.com//climg/5cd262a20001040f06820464.jpg

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

http://img1.sycdn.imooc.com//climg/5cd263c60001a5c603220133.jpg

效果图:

http://img1.sycdn.imooc.com//climg/5cd263fe000166b503900167.jpg

如果帮助到了你,欢迎采纳!

祝学习愉快~~~

好帮手慕慕子 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

如果帮助到了你,欢迎采纳!

祝学习愉快~~~

  • 提问者 慕瓜9218797 #1
    还是不太明白。执行nAdd后rs的弹出会发生变化,说明nAdd改变的n和rs中保存的是同一个。为什么用f1重置n以后,nAdd里的n和rs里的就不一样了呢?
    2019-05-08 12:29:05
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
HTML5&CSS3进阶与常用框架 2018
  • 参与学习       315    人
  • 提交作业       136    份
  • 解答问题       626    个

如果你有H5、CSS3、JS基础,热爱前端并希望在前端应用方面不断进步,那就来吧,本路径为你带来的课程有HTML5进阶、CSS3进阶、JS面向对象、jQ基础、Less等,助你进一步提升前端开发技能

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师