美文网首页
Javascript-函数闭包

Javascript-函数闭包

作者: 一座被占用 | 来源:发表于2017-04-18 11:46 被阅读0次

    javascript函数闭包一直是本人没搞懂,概念模糊的盲点。在项目中也遇到过,只是当真正的代码放我面前的时候我还是搞错。

    所以就查阅资料后,对它的基本用途和概念有了一个模糊的印象。要说搞懂了那还差一大截。别信那些 “一句话搞懂js闭包” 的鬼话。言归正传

    1.Javascript的变量作用域:全局变量和局部变量。全局变量会带来全局变量”污染“,但是局部变量又导致了函数外部无法读取函数内的局部变量。所以就有了闭包的概念

    2.闭包特性:

    2.1:函数嵌套这函数

    2.2:函数内部可以引用外部的参数和变量

    2.3:参数和变量不会被垃圾回收机制回收

    闭包实例 闭包运行结果

    上面这个闭包实例很基础简单的了。仔细看也很好理解。

    另外一个闭包实例

    var result = f1() ---->result = f2

    result() -----> f2() 这个时候n是999

    nAdd()  ------>f1里面的n(999)加上1;

    result() ------>f2() 这个时候n是1000了

    有人会很疑惑:var n = 999;是在f1里面的局部变量,当被执行一次后,为什么没有被释放内存?这个也是闭包的一个特点:这个变量n的值始终保持在内存中!!!为啥呢?

    原因在于f1是f2的父函数,而f2被赋给了一个全局变量,这导致f2始终在内存中,而f2的存在依赖于f1,因此f1也始终在内存当中,不会再调用结束后被GC(garbage collection)回收.

    上面就是我“理解"的函数闭包,希望在实践中得到验证和加强对闭包的理解!

    最后贴出参考地址和里面的两道思考题:

    http://www.ruanyifeng.com/blog/2009/08/learning_javascript_closures.html

    思考题1:

         var name = "The Window";

         var object = {

                   name : "My Object",

                   getNameFunc : function(){

                         return function(){

                              return this.name;

                         };

                  }

          };

    console.info(object.getNameFunc()());

    思考题2:

         var name = "The Window";

         var object = {

              name : "My Object",

              getNameFunc : function(){

                   var that = this;

                        return function(){

                                return that.name;

                        };

                }

          };

    console.info(object.getNameFunc()());

    什么?我还像听到你在问我:这题你会吗?我不会呀!求指导!!!!

    相关文章

      网友评论

          本文标题:Javascript-函数闭包

          本文链接:https://www.haomeiwen.com/subject/vnsfzttx.html