当前位置:首页 > 开发 > Web前端 > JavaScript > 正文

《Javascript高级程序设计(第3版)》闭包理解

发表于: 2013-03-09   作者:bijian1013   来源:转载   浏览:
摘要: “闭包是指有权访问另一个函数作用域中的变量的函数。”--《Javascript高级程序设计(第3版)》         看以下代码: <script type="text/javascript"> function outer() { var i = 10; return f

“闭包是指有权访问另一个函数作用域中的变量的函数。”--《Javascript高级程序设计(第3版)》

 

      看以下代码:

<script type="text/javascript">
    function outer() {
        var i = 10;
        return function() {
            return i++;
        }
    }
   
    var inner = outer();
    var str = "";
    for (var i=0;i<5;i++) {
        str += inner()+" ";
    }
    document.write(str);
</script>

      结果:10 11 12 13 14

 

      认为闭包是一个现象,是内部函数(function() {return i++})引用了外部函数(outer)的变量(i),且被返回到外部去(var inner = outer()),导致外部函数的执行环境没被释放(i的值得以保存)的现象。

 

      看到那句话的时候,才意识到自己的理解是错误的。上述现象是闭包的特性、现象,这种奇特的现象,可以通过结合作用域链、垃圾收集的知识点得到解释。

 

      现在更新下知识:闭包是一个函数。我们可以通过判断该函数是否能够访问其他函数作用域中的变量、函数来判断一个函数是不是一个闭包。

 

       提出疑问:当一个函数有权限但没有访问其可访问的其他函数的变量、函数时,它还是一个闭包吗?如果根据书中的定义,那么答案是肯定的。

      如下面的代码:

<script type="text/javascript">
    function demo1(name){
        this.getName = function() {
            return name;
        }
    }
   
    var inst  =  new demo1("Lcllao");
    alert(inst.getName());//这个应该是了,通过new方式执行函数test,返回了当时的this对象。通过getName访问当时作用域上的name变量。
    demo1("Lcllao");//在这个时候,上面的匿名函数是闭包吗?
   
    function demo2() {
        var i = 0;
        return function() {//按照上述定义,这个匿名函数应该也是一个闭包。他有权但没访问demo2的变量i。
            return "";
        }
    }
</script>

 

《Javascript高级程序设计(第3版)》闭包理解

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
JavaScript高级程序设计(第3版) 编辑推荐   一幅浓墨重彩的语言画卷,一部推陈出新的技术名著  
转自:http://www.shaoqun.com/a/43768.aspx 访问和操作浏览器窗口的模型称为浏览器对象模型BOM(Br
最近去面试了一家企业,结果非常灰心丧气,于是周末给自己定了一个目标 学好一门,学精通一门。不求
什么是闭包 闭包是指有权访问另一个函数作用域中的变量的函数(有点拗口吧),简单点就是在一个函数
  在JS这块,免不了被问什么是闭包。   从一个常见的循环问题说起。   有一个ul列表, 里面有5
理解Javascript的闭包 原文 http://coolshell.cn/articles/6731.html 前言:还是一篇入门文章。Java
一、变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域。 变量的作用域无非就是两
  访问和操作浏览器窗口的模型称为浏览器对象模型BOM(Browser Object Model),但习惯上是把所有
五、闭包的微观世界 继续使用上篇的代码: function a() { var i = 0; function b() { alert(++i);
官方”的解释是:闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号