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