【基础】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())

 

运行的结果:

 

posted @ 2017-02-10 16:58  我爱测试胜于爱自己  阅读(99)  评论(0)    收藏  举报