• 读《Javascript高级程序设计(第3版)》部分章节后,修正之前对闭包的误解,并提出疑问


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

          看以下代码:

    function outer() {
        var i = 0;
        return function() {
            return i++;
        }
    }
    
    var inner = outer();
    var str = "";
    for (var i=0;i<5;i++) {
        str += inner()+" ";
    }
    document.write(str);

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

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

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

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

          如下面的代码:

    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 "";
        }
    }
  • 相关阅读:
    Elasticsearch倒排索引结构
    Redis(二)冰叔带你了解Redis-哨兵模式和高可用集群解析
    jenkins构建配置
    jenkins配置email
    jenkins配置maven
    jenkins配置java
    jenkins配置git
    centos安装jenkins
    centos安装tomcat
    centos安装jdk
  • 原文地址:https://www.cnblogs.com/lcllao/p/2444854.html
Copyright © 2020-2023  润新知