闭包函数:1.函数内部定义函数 2.内部函数使用了非它作用域的参数。

发布时间 2023-11-15 12:01:11作者: 龙陌

执行以下程序,输出结果为()

function outer(){
       var num = 0;
        function inner(){
             num++;
             console.log(num);
       }
           return inner;
}

var f1 = outer();
 f1();
 f1();

 var f2 = outer();
 f2();
 f2();

A
1 2 3 4

B
1 1 1 1

C
1 2 1 2

D
1 1 2 2

正确答案:C

闭包变量为num,内部函数inner可以访问到外部函数outer的num变量,这相当于授权该变量可以被延迟使用,
每次调用外部函数时,都会开辟相应的内存空间,闭包变量num会保存在该内存空间中,直到该外部函数的内存空间被销毁。
在本题中,调用外部函数outer时开辟一个内存空间,变量num保存在该内存空间中,因此两次调用f1的输出结果为1 2;
当再次调用外部函数outer时,又重新创建一个内存空间,因此两次调用f2的输出结果同样为1 2。

闭包函数:1.函数内部定义函数 2.内部函数使用了非它作用域的参数。

闭包函数作用:1.延长参数的生命周期 2.变量私有化。

局部变量会常驻在内存中。

var f1 = outer();
f1();
f1(); // 变量常驻内存

每次外部函数执行的时 候,外部函数的引用地址不同,都会重新创建一个新的地址。

var f1 = outer();
var f2 = outer(); // 外部函数每次调用,都会开辟新的内存空间。

这其实是一道考察闭包和作用域链的问题。

f1、f2赋值执行了两次outer函数,所以创建了两个执行上下文,返回了两个闭包,都知道闭包会保留住父上下文的活动对象(es5以后是词法环境)不被销毁,所以这两个闭包保留的是两个父执行上下文的活动对象,而不是一个,所以f1的i会在f1执行多次的情况下累加,而f2的i会在f2执行多次的情况下累加,他们相互不冲突。