执行以下程序,输出结果为()
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执行多次的情况下累加,他们相互不冲突。
标签:闭包,f1,f2,outer,函数,作用域,num From: https://www.cnblogs.com/longmo666/p/17833528.html