Javascript闭包简介:

Javascript语言中,有一个独特的概念:闭包(closure),这在类似C++,Java等编程语言中没有这个概念。很多高级应用都要依靠闭包实现。

为什么是闭包:

或者说,为什么需要闭包,闭包的作用到底是什么?要理解这个概念,首先要理解Javascript中的作用域。

闭包的作用域:

和Java,C/C++等高级编程语言一样,Javascript也有作用域这个概念。但是,相比而言,它们有很大的区别。

1). 变量的标识:Java,C/C++等编程语言是强类型语言,即变量的声明需要用类型来标识(无论是普通类型,还是自定义类型)。

而Javascript语言是弱类型语言,即不需要用具体的类型来标识变量(例如,只需要用var/let,或者都不需要用它们来标识)。

2). 变量的作用域:
Javascript:函数内部可以直接读取全局变量;在函数外部无法访问函数内的局部变量。

函数内部声明的变量,一定要用var来标识;如果一个变量没有标识,则这个变量实际上是一个全局变量。

例如:

var x=10;function fun1(){var y = 20;z = 30;console.log(x); //success}fun1()//console.log(y);  //error:Uncaught ReferenceError: y is not defined。
//分析:y是fun1的内部变量,在函数外部方法fun1的内部变量yconsole.log(z);  //success:z实际上是全局变量

运行结果:

10

30

10

闭包的概念以及使用:

可以将闭包理解为: 一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。

例如:

function fun2(){var x=100;function fun3(){console.log(x); }return fun3;}var result=fun2();result(); //success,输出100

这就是一个闭包的例子。fun2函数的返回值赋给result,再执行result(),从而访问到fun2中的fun3函数的代码。

有时,我们需要能够访问到函数内的局部变量,这时,就需要用闭包来实现。例如,

function fun4(){var x=100;iAddOne = function(){x=x*x;}function fun_41(){console.log(x);}return fun_41;}var res=fun4();res(); // 10iAddOne();res(); // 11

运行结果:

100

10000

可见,这里,闭包是一个函数。

闭包的另外一个作用是:

让闭包表达式的变量始终保存在内存中。因为“变量也是该表达式的一部分”,所以,在函数外部拥有来这个闭包表达式,就相当于拥有来表达式中的变量。
只有在”拥有表达式的函数“的生命周期结束,闭包的生命周期也随之结束。

闭包还可以净化命名空间。

Javascript的一大糟粕就是命名空间冲突。

在C++中,使用using namespace 来进行命名空间的声明和使用;

在java语言中,用import packagename来进行区别。

而在Javascript中,却没有这样的机制。这样,很容易引起类似“同名方法的多处定义和引用”而带来的问题。

因此,有了闭包,在某种程度上,可以减缓这类问题。即内部函数名称相同,但是外部函数可以不同名字就行。

例如:

function fun_test() {function fun1(){var x=100;function fun_common(){console.log(x); }return fun_common;}function fun2(){var y=200;function fun_common(){console.log(y); }return fun_common;}var result1=fun1();result1(); //success,输出100var result2=fun2();result2(); //success,输出200}

运行结果:

100

200

可见, fun_common分别在fun1和fun2函数中有定义,在fun_test中可以正确访问到它们。

Javascript语言中一个独特的概念:闭包(closure)相关推荐

  1. java语言保留结构和联合_Java 语言中取消了联合概念,保留了结构概念。( )_学小易找答案...

    [单选题]Graves病最严重的临床表现是 [判断题]Java 语言中取消了联合概念,保留了结构概念.( ) [单选题]下列关于子类继承父类的成员的描述中,错误的是 . [多选题]冯.诺依曼机确立计算 ...

  2. C语言中一个程序写完后怎么运行啊?

    C语言中一个程序写完后怎么运行啊? 当编写bai完一个程序后,需要首先进行编译,然后再运行. 如下图所示,程序编写完毕后,点击工具栏中的Execute,选择compile(编译). 如果没有错误,再选 ...

  3. 最简洁的解释动态语言中的鸭子类型和闭包

    常见定义 闭包 是拥有独立变量(在封闭空间中定义的可以在本地环境中使用的变量)的函数 程序语言中的闭包(closure)概念不是由JavaScript最先提出的,从smalltalk开始,闭包就成了编 ...

  4. python语言中最基本的概念_Python 学习之路-基本的概念(三)

    Python中一些经常用到的概念: 1.在Python中是没有常量的概念,换句话说在Python各种所有量都是可以更改的,规定将项定义为常量的量都定义为大写,eg:CONSTOF = "th ...

  5. 在c语言中一个字符常量代表,c语言中字符常量是什么?

    前言继承是OOP设计中的重要概念.在C++语言中,派生类继承基类有三种继承方式:私有继承(private).保护继承(protected)和公有继承(public).一.继承规则继承是C++中的重要特 ...

  6. c语言 u2_printf,C语言中关键字restrict的概念,使用范围,例子

    概念: restrict,C语言中的一种类型限定符(Type Qualifiers),用于告诉编译器,对象已经被指针所引用,不能通过除该指针外所有其他直接或间接的方式修改该对象的内容. 渊源: res ...

  7. C语言中一个指针传递问题的分析

        指针在C语言中扮演着极为重要的角色,它的存在为C语言提供了极大的灵活性,当然,不少问题也是由指针所引起的(双刃剑).本文通过分析一个由指针传递所引起的错误,从而使得我们更加重视指针在编程中的传 ...

  8. Go语言中协程的概念和基本使用

    为什么80%的码农都做不了架构师?>>>    Go协程(Goroutine)是与其他函数同时运行的函数.可以认为Go协程是轻量级的线程.与创建线程相比,创建Go协程的成本很小.因此 ...

  9. c语言中一个字母-97 1,C语言学习(1)

    一.C语言基础 1. 学习方法 多看+多敲+多思考总结 2. C语言历史 机器码: 01二进制去写代码,困难很大 10+11运算 + ---> 01001 汇编语言:用助记符替换掉机器码中的序列 ...

最新文章

  1. 编译vim-8.2并配置jedi-vim插件
  2. STL中的lower_bound() 和 upper_bound()
  3. python 图像降噪
  4. 关于面试的一些问题合集
  5. python爬虫简单实例-Python 利用Python编写简单网络爬虫实例3
  6. android cliptopadding java代码_android:clipToPadding属性的分析——以ListView的别样padding为例...
  7. Create Tables and Build inserts from Tables by using Mygeneration Templates(Sql Server)
  8. python异常处理_Python 工匠: 异常处理的三个好习惯
  9. 解决只可以上QQ却不可以上网问题
  10. linux命令行模式下实现代理上网 专题
  11. 如何用VB实现Excel文件的自动合并
  12. C#绘图双缓冲技术总结(转)
  13. chromium中的性能优化工具syzyProf
  14. 【第三方互联】5、网页添加QQ好友及QQ群组
  15. 独立开发一款简单的安卓app
  16. Android聊天室
  17. 高通量基因组测序中,什么是测序深度和覆盖度?
  18. 银行中台与互联网中台有什么不同?该怎么建?
  19. 华为防火墙实现双机热备配置详解
  20. Google Summer of Code谷歌编程之夏活动流程全解析(上)

热门文章

  1. 仓管平面图(自定义布局)
  2. node.JS环境变量配置
  3. 发号器:雪花算法(Snowflake)
  4. 物联网工程实训 第5天
  5. java数据导出PDF文件
  6. python词频统计完整步骤_python实现词频统计(wordcount)函数
  7. 【STM32】入门(九):HAL库学习
  8. 定长子网划分和变长子网划分详解
  9. 使用CSS - mask 实现视频弹幕人物遮罩过滤
  10. Jasperreport 导出pdf 中文不显示问题