天行健, 君子以自强不息
Sunny's Blog
Title

理解闭包(2016/02/15更新)

闭包是js中的一个重点问题,这个概念其实不难,重在理解。下面是一个闭包的例子,通过这个例子,对闭包能有更深刻的认识。

闭包理解1:函数定义时的作用域链,在函数执行时依然有效。见上例,f2中return num的作用域链,首先查找f2,没有向上查找f1,找到返回的就是1,如果没找到会继续向上找那个全局的num=8。这个f2是在f1中定义的,在f1外执行bb(即f2)的时候作用域链依然有效。

闭包理解1:闭包就是能够读取其他函数内部变量的函数。见上例,bb函数在f1外执行,但是他仍然可以调用到f1中得变量num

关于闭包的用途有缓存,实现封装,实现面向对象中的对象等,具体可以看下这篇blog了。 js闭包的用途

2015/05/27

这两天深入学习了下闭包,有了更深的体会,闭包是两个作用域链碰撞产生的激情,他的标志很可能就是函数嵌套,外层函数将内层函数名返回造成的。也因为此,本该在外层函数内部销毁的局部变量,因为内层函数调用,且内层函数被暴露到外层函数之外,而被一起保留下来。

2016/02/15

转眼快两年了,项目中用到的闭包,或者说刻意去用的闭包不多,对这个概念还是在阶段性不断理解中。现在简化的理解就是,闭包是函数A在执行中可以获取函数B中局部变量的方式,从作用域链的角度来说,这个方式的实现需要函数嵌套,即B中套A才可以达到。B中的A是不可撤销的,A和B中的变量同处于一个作用域所以也无法撤销。

                    //这也是一个闭包
                    function bingClick(){
                        var id = "test";
                        document.getElementById('save').onclick = function(){
                            saveDocment(id);
                        }
                    }
                

onclick事件在bingClick内部定义,是函数嵌套,onclick执行的时候可以调用到bingClick函数中的局部变量id

地势坤,君子以厚德载物