zoukankan      html  css  js  c++  java
  • JavaScript的“闭包”到底是什么

    在JavaScripot函数闭包的定义中,一般都有一个outer 函数,一个inner函数。那么“闭包”到底是指outer函数呢,还是指inner函数?

    从官方定义来看,并不清楚:A closure is a combination of a code block and data of a context in which this code block is created.

    那么在下列函数中:

    function outerfunc(y) {

     

              var internal1 = 100 ;

              var internal2 = 200 ;

             

              function innerfunc1(x) {

                        internal1++;

                        internal2 --;

              }

                       

              function innerfunc2()

              {

                        internal1--;

                        internal2++;

              }

             

              function get1()

              {

                        return internal1;

              }

             

              function get2()

              {

                        return internal2;

              }

             

              y.func1 = innerfunc1;

              y.func2 = innerfunc2;

              y.get1 = get1;

              y.get2 = get2;

    }

     

    到底是哪个函数闭包那个呢?是outerfunc闭包innerFunc1, innerfunc2呢?还是相反?

    一般的教科书认为是innerfunc1 闭包了internal1和internal2。同样innerfunc2闭包了上述两个变量。这也不违反上述官方定义,只是总觉得在“语义”层面说不过去。看过我C++博客的读者会知道我对语义的痴迷。

    我认为,正确的理解应该是outerfunc, innerfunc1, innerfunc2,get1,get2共同组成一个闭包,包揽了outerfunc的所有自由变量,参数, 以及local变量。

    为什么呢?因为:

    1) innerfunc1 和innerfunc2 都“定义”在outerfunc内,共享outerfunc的自由变量internal1和internal2。单独谈哪一个函数都没有意义。

    2) 因为有了innerfunc1和innerfunc2,outerfunc的“语义”发生了根本的变化。本来是“auto”变量的internal1和internal2变成了“heap”变量。具体的实现是JavaScript的implementation细节。但是懂得这一微妙的细节,会加深你对JavaScript的理解。也知道closure的实现代价。

    3) 上面这条的详细解读:没有闭包的outerfunc可以优化,利用stack变量来实现internal1和internal2。有了闭包,internal1和internal2必须由Garbage collection 来实现。功能当然会大幅下降。

    以上第二点,对理解“闭包”,以及JavaScript函数的性质,有根本意义。

    2014-8-26 西雅图

  • 相关阅读:
    利用Lucene将被索引文件目录中的所有文件建立索引
    Carrot2 in action 初步印象
    Lucene建立索引搜索入门实例
    Lucene索引文件组成
    模拟浏览器登陆的基本思路与做法
    HttpWatch使用教程
    httpclient 怎么带上登录成功后返回的cookie值访问下一页面
    Google开源库-Volley的使用
    Android Material Design 学习笔记
    2015年山东省齐鲁软件大赛总结
  • 原文地址:https://www.cnblogs.com/ly8838/p/3937311.html
Copyright © 2011-2022 走看看