【基础】4 闭包
正常的情况,当函数被调用,会入栈,当运行完成之后会弹出,为此函数开辟的内存空间便消失了。
如果直接运行 可以看到返回了 内部的 f2函数代码块。
此时 f1 函数什么时候销毁是由js运行环境的 GC 决定的。

通过 定义一个tmp变量来指向 f1,这样f1 在 就会被引用到,当js的 GC扫描时就不会把它列为销毁的目标。
当运行tmp时 就会访问到低一级的 作用域链的变量。打印 结果 : 10.

例 2:

总结:
形成闭包的条件:
正常的情况函数持行的时候 会压栈,持行完之后会弹出栈空间,函数内的局部变量也会释放。这是js的垃圾回收机制。但闭包利用了一个技巧 把函数的持行环境给保存了下来不被回收。技巧如下:
1 返回了子作用域链,或子子作用域链。return function(){ }
2 并且返回的作用域链 引用了父级作用域链。
例3:
function f1(){ var i=0; return function(){ window.console.log(i) i++; } } f=f1() window.console.log(f()) window.console.log(f()) window.console.log(f()) window.console.log(f()) window.console.log(f())
运行的结果:

浙公网安备 33010602011771号