function f1(){
var result=0;
return function (){
return result++
}
}
let a1=f1()
1.第一次调用a1()的时候为什么输出0而不是1呢,不是已经++了吗
2.a1()多次执行的结果是0,1,2,3....那为什么f1()()就全都是0呢
3.好多人都说result一直存在于内存中是因为a1引用的原因,那下面这个函数也是a1引用了呀,
function f1(){
var result=0;
return result++
}
let a1=f1()
求解答
###第一个问题 : 为什么已经++了还是0而不是1呢,首先你要搞懂 i++ 和 ++i是两个不一样的,如果是return ++result 那么实惠输出1
第二个问题 : 因为a1()执行多次因为他们所处的作用域是一样的 , 为什么不写a1 = f1()直接f1()()每次都是输出0呢,原因就是每次f1()得到的函数都是不同的,所以产生的闭包所处作用域也是不同,所以每次输出0
###通常情况下,函数在调用完毕,其内部变量会被自动销毁
function f1(){
var result=0;
return result++
}
上述f1 函数返回的是一个数值类型,用完即丢弃。每调用一次,重新生成一个。
function f1(){
var result=0;
return function (){
return result++
}
}
而这里的f1返回的是一个函数,它间接持有外层函数变量值result。当你使用该返回函数,你不仅拥有该函数本身,还隐性抵达有外层函数环境。正因如此,有些模式会将闭包作为某种私有权限的封装。
当你对返回的函数进行重复调用时,自然会累积操作“私有的”result
而外层函数又被调用了,则意味着又一个新的开始。