为什么多出来一个f1()();结果不一样
来源:2-5 闭包
Bravura
2019-12-07 20:32:16
function f1() { var n = 999; nAdd = function() { n = n + 1; }; function f2() { console.log(n); } return f2; } var rs = f1(); rs(); nAdd(); rs();
function f1() { var n = 999; nAdd = function() { n = n + 1; }; function f2() { console.log(n); } return f2; } var rs = f1(); f1()(); rs(); nAdd(); rs();
3回答
好帮手慕粉
2020-03-17
“qq_慕粉9137647”同学你好,关于同学的问题回答如下:
1、在函数中,前面有var声明的就是局部变量,不能在函数外部直接进行访问。没有var声明就是全局变量,可以直接在外部进行访问。例:
控制台:
在这个里面,nAdd也是一样的,它相当于test1,可以在外部直接进行访问。
2、不调用f1函数是不可以执行nAdd函数的,因为函数不调用是不会执行的,只有调用了f1,才能执行f1函数内部的代码。
3、改变的是f1作用域下的n,执行结果不一样是因为函数调用顺序问题:
4、同学如果有问题,建议同学新建一个问答进行提问呢,这样即有利于同学后期的复习与整理,老师也能更快的看到同学的问题。
同学再理解一下。
祝学习愉快~
好帮手慕粉
2019-12-08
同学你好,关于同学的问题解答如下:
1、理解的是有偏差的。nAdd函数并不是f1()()调用的,它是全局变量,nAdd()就可以进行调用,它的调用与f1()()与rs()都没有关系。
2、是产生了两个闭包,每个闭包作用域里面的都不会互相影响,在调用f1()()时,调用nAdd()执行n+1改变的是f1()()作用域里面的n,而rs()作用域里面的n没有受到影响。
这块的内容本身就晦涩难懂,同学慢慢来。
如果我的回答帮助到了你,欢迎采纳,祝学习愉快~
好帮手慕粉
2019-12-08
同学你好,关于同学的问题解答如下:
1、先看第一部分的代码:
2、再看第二部分的代码,这样调用后,产生2个闭包,每个闭包之间独立,每一个闭包中都会有自己的n值。nAdd执行时,第一个闭包的nAdd被覆盖,变成第二闭包的nAdd了,所以nAdd改变的是第二个闭包的值:
如果我的回答帮助到了你,欢迎采纳,祝学习愉快~
相似问题