如何判断是不是闭包?

我知道下面这个是闭包

function makeFunc() {
      var name = "Mozilla";
      function displayName() {
        alert(name);
      }
      return displayName;
    }
    
    var myFunc = makeFunc();
    myFunc();

有人说,在执行过程完毕后,返回函数,或者将函数得以保留下来,即形成闭包。那么,是不是下面的第一种就可以算作闭包了,红皮书说,函数内部创建另一个函数叫闭包,那么如何解释下面两个情况?

    
    var a = 1
    var b = function(){
    console.log(a)
    }
    
    var c = 1
    function d(){
    console.log(c)
    }

《javascript权威指南》 (第六版)第8章第6节:从技术的角度讲,所有的JavaScript函数都是闭包:它们都是对象,它们都关联到作用域链。
《javascript高级程序设计》(第三版)第7章第2节:闭包是指有权访问另一个函数作用域中的变量函数;

阅读 7.5k
7 个回答

真巧,这几天也在看有关闭包的资料,然而,看了半天,资料中对闭包的各种定义乱飞,最后我也不知道该如何去定义闭包了,好纠结,直到昨天看到了一篇文章,才认识到自己至于在闭包的定义上面纠结吗

下面是对文章的一部分摘抄:

闭包,有人说它是一种设计理念,有人说所有的函数都是闭包。我不知道如何去定义它,我也不准备去定义它,定义它就是限制了对它的理解。

我们依赖光来看清世间万物,光却遮住了黑暗。如同你脚下的路,让你看不清前行的方向。

在这里写一点我对闭包的理解。理解闭包的关键在于:外部函数调用之后其变量对象本应该被销毁,但闭包的存在使我们仍然可以访问外部函数的变量对象。

文章链接


哈哈

道可道,非常道;名可名,非常名。

所有的函数就是闭包啊因为有一个很大的window全局对象,你生命的全局变量在你写的函数里能用,那么这个函数就是闭包,这是最简单的,你可以理解为在你写的函数外部有一个默认的全局函数,你所有写的函数都在这个函数内部。这是我个人理解有错误欢迎指出

闭包是基于函数作用域链的,本质上就是函数作用域会延伸到该函数内定义的子函数。

JS里所有函数都是闭包。displayName关联到makeFunc局部环境算是闭包,那makeFunc关联到全局环境就不算闭包嘛??

实际的模型是这样,displayName关联到makeFunc局部环境,makeFunc局部环境关联到makeFuncmakeFunc关联到全局环境,全局环境就是终点。任何函数的终点都是全局环境,所以任何函数都能访问全局的东西。

但是与定义在全局环境的函数不同的是,定义在函数中的函数多了一层,关联链上也就多了一个局部环境。如果你嵌套两层,比如displayName嵌套makeFunc1嵌套makeFunc2,那么就会多出两个局部环境来。函数可以访问沿途所有局部环境中的东西,也就是说makeFunc2可以访问displayNamemakeFunc1局部环境中的东西。

    全局环境
        ↑
  displayName函数
        ↑
displayName局部环境
        ↑
  makeFunc1函数
        ↑
makeFunc1局部环境
        ↑
  makeFunc2函数
        ↑
makeFunc2局部环境

JS中会一直沿着这个链向上寻找,而Py中必须明确声明。比如全局变量,想访问的时候必须声明global,这样解释器会直接在尾部的全局环境中寻找,如果要访问中间的东西,必须声明nonlocal,这样解释器会在不是头也不是尾部的环境中寻找。

参考:https://github.com/wizardforc...

子函数调用父函数的局部变量就形成闭包

比较透彻的了解作用域,原型链,this就行了,闭包这东西,能忘就忘吧

广义闭包:任何函数都是闭包
狭义闭包:函数内嵌套函数就是闭包

闭包的三大特性:
1.函数嵌套函数
2.函数内部可以引用外部的参数和变量
3.参数和变量不会被垃圾回收机制回收

你可以看下这个链接,讲的跟详细:
http://www.codeceo.com/articl...

推荐问题
宣传栏