谈谈我对闭包知识的深刻理解

在javascript中闭包应该是最难理解的一部分内容。在我看来闭包就是和作用域之间的联系。

1、首先我们来了解一下javascript中的作用域知识。

javascript中的作用域其实就指的函数作用域,因为只有函数在javascript中才能形成区域范围。而函数作用域有一下特点。

1.1 函数能访问到外部的变量。案例一:

   var num = 123;
     function fn() {
        console.log(num);//输出的值为123
     }
     fn();

1.2 函数内的变量不能被外部访问到。案例二:

  function fn(){
  var num=123;
 }
  console.log(num)//输出值:num is not undefined说明函数内部的变量是不能被外边访问的。

2、下面就该说闭包了

从上面案例二我可以知道函数会形成一个封闭的区域,对其中的变量起到保护作用,使函数外边无法访问。

闭包:从字面意思来理解就是封闭和包裹,换句话说,就是在函数内部定义的变量,在函数的外部无法访问到,因此就说函数构成了一个闭包。

说白了闭包是作用域的应用。

计算机科学中对闭包的定义为:一个函数的函数体以及函数所处的环境,构成的一个综合体叫做:闭包

函数体:就是函数内部的代码。

函数所处的环境:指的就是作用域。

是不是觉得计算机科学中对闭包的定义是不是很难理解。

3、使用闭包来解决什么样的问题?

我使用闭包来解决如何访问函数内部变量的问题。 下面我写个史上最简单的闭包。

  function foo() {
        var num = 123;

        function fn() {
            return num;//
        }
        return fn;
    }
    var m=foo();
    var f=m();
    console.log(f);//输出的值为123,这样就可以访问到函数内部变量num。

      原理就是利用闭包:在函数foo中嵌套了一个函数fn,利用函数fn可以访问到其外部的变量,而获取函数foo中的变量num,当外部调用函数foo()时候,
      函数foo中 return返回fn函数的实体,然后我再对函数fn进行调用就在外部访问到函数内部变量num了。就是利用内部函数的闭包特性把函数foo中的变量取到外边,
      说白了内部函数就相当于一个媒介,就是一个桥梁连接函数内部和外部。这就是闭包作用。
时间: 2024-10-14 06:16:10

谈谈我对闭包知识的深刻理解的相关文章

【知识】深入理解js闭包

本文转载: 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. Js代码 var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外部自然无法读取函数内的局部变量. Js代码 function f1(){ var n=999; } alert(n); // error 这里有一个地方需

深刻理解JavaScript基于原型的面向对象

主题一.原型 一.基于原型的语言的特点 1 只有对象,没有类;对象继承对象,而不是类继承类. 2  "原型对象"是基于原型语言的核心概念.原型对象是新对象的模板,它将自身的属性共享给新对象.一个对象不但可以享有自己创建时和运行时定义的属性,而且可以享有原型对象的属性. 3 除了语言原生的顶级对象,每一个对象都有自己的原型对象,所有对象构成一个树状的层级系统.root节点的顶层对象是一个语言原生的对象,其他所有对象都直接或间接继承它的属性. 显然,基于原型的语言比基于类的语言简单得多,我

深刻理解Docker镜像大小

都说容器大法好,可是假设没有Docker镜像,Docker该是多无趣啊. 是否还记得第一个接触Docker的时候,你从Docker Hub下拉的那个镜像呢?在那个处女镜像的基础上.你执行了容器生涯的处女容器.镜像的基石作用已经非常明显.在Docker的世界里,能够说是:No Image,No Container. 再进一步思考Docker镜像,大家可能非常快就会联想到下面几类镜像: 1.系统级镜像:如Ubuntu镜像.CentOS镜像以及Debian容器等: 2.工具栈镜像:如Golang镜像.

深刻理解Java中的String、StringBuffer和StringBuilder的差别

声明:本博客为原创博客,未经同意.不得转载!小伙伴们假设是在别的地方看到的话,建议还是来csdn上看吧(链接为http://blog.csdn.net/bettarwang/article/details/26412497),看代码和提问.讨论都更方便. 首先简单地来梳理一下Java中String.StringBuffer和StringBuilder各自的含义. 1.String类 首先.它是线程安全的,即能够用于多线程编程中. 其次,String类的对象是不可变的,即在定义时就确定了,类似St

C++ 类的多态一(virtual关键字--构造函数深刻理解)

//virtual关键字--构造函数深刻理解 #include<iostream> using namespace std; /* C语言编译器,c++编译器全部是静态链编,就是一段一段代码的编译,不会考虑上下文 例如编译到void ProtectA(Point pin) 编译器就会认为pin就是Point类型, 而不会去联系上下文,去分析pin有没有可能是子类对象 virtual关键字会自动检测这个父类对象有没有是子类对象 */ /* virtual关键字的作用 假设父类中存在用virtua

深刻理解Java中的String、StringBuffer和StringBuilder的区别

首先简单地来梳理一下Java中String.StringBuffer和StringBuilder各自的含义. 1.String类 首先,它是线程安全的,即可以用于多线程编程中: 其次,String类的对象是不可变的,即在定义时就确定了,类似String str="Hello";str+="Java";的语句其实是生成了新的对象,只是我们未察觉到而已.但是注意在大量的字符串新建对象时消耗就很可观,这时必须考虑采用StringBuffer或StringBuilder,否

作用域、闭包等概念的理解

总结一下我对JS中这些基本却略纠结的概念的理解. 作用域 我们知道,JS不支持块级作用域,只支持函数作用域.函数体内,既不是局部变量,也不是参数的变量称为自由变量.如果没搞清楚函数的作用域,有时某些自由变量的值会与你所想的很不一样.举个简单例子 1 var a = 10; 2 3 function getA() { 4 alert(a); 5 } 6 7 (function() { 8 var a = 20; 9 getA(); //10 10 })(); 11 12 (function(fn)

深刻理解Nginx之Nginx完整安装

1.   Nginx安装 1.1预先准备 CentOS系统下,安装Nginx的库包依赖.安装命令如下: sudo yum groupinstall "DevelopmentTools" sudo yum install pcre pcre-devel sudo yum install zlib zlib-devel yum install perl-ExtUtils-Embed sudo yum install openssl openssl-devel 1.2 安装 最重要的特性和基

深刻理解Nginx之Nginx与Python(1)

6 Python和Nginx 6.1 介绍FastCGI FastCGI(Fast Common Gateway Interface)是基于CGI上的改进,是CGI的一种演变产物.尽管目的是保持相同的,FastCGI在CGI上提供了重大的提升,通过建立起下面的原则. l  代替对于每个请求孵化一个新进程,FastCGI采用持久化进程,伴随着能够处理多个请求的能力. l  Web服务器和网关应用程序通过使用sockets比如TCP或者POSIXT 本地IPC sockets来交流.其结果是,它们的