该程序如何提供输出5 6 7
请解释我的代码
输出: 五 6 7 未定义
代码
var a = (function() {
var x = 5;
function m() {
console.log(x++);
}
return m;
}());
function b() {
a();
a();
a();
}
b();

答案 0 :(得分:2)
var a
是立即调用表达式函数(IIEF)的结果
var a = (function() {
...
}());
在这个IIEF中,我们有一个局部变量x,用值5
初始化var x = 5;
我们还有一个函数,m将x的值输出到控制台,然后将x的值加1:x++
是x = x + 1
function m() {
console.log(x++);
}
IIEF返回函数(不是函数的结果) - 这就是var a
现在如何对函数m
的引用 - 这意味着使用符号{来调用a {1}}正在调用a()
function m
接下来,函数b被定义为简单地调用函数a 3次
return m;
接下来,调用函数b - function b() {
a();
a();
a();
}
b()
这是第一次调用b();
调用function a
输出function m
的值,即5,然后将x
增加为6
现在b第二次调用x
调用function a
输出function m
的值,现在为6,然后将x
增加为7
现在b第三次调用x
调用function a
输出function m
的值,现在为7,然后将x
增加为8
因为x
没有返回任何内容,并且您在某种控制台上运行此操作(可能是浏览器开发工具或节点),控制台会记录function b
的结果,这在那里是未定义的没有function b
值
答案 1 :(得分:0)
引用外部范围变量的内部函数的概念称为闭包。
当您调用外部函数并将其返回的函数分配给另一个变量时,该变量仅被声明一次。每次调用返回的函数时,它都在使用并修改一个现在只能被返回函数引用的变量。