我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Javascript的独特的概念之闭包

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Javascript的独特的概念之闭包

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的内部变量y
    console.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(); // 10
    iAddOne();
    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,输出100
  var result2=fun2();
  result2(); //success,输出200
}

运行结果:

100

200
 

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

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注编程网的更多内容!  

vv

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Javascript的独特的概念之闭包

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

一文搞懂JavaScript中最难理解概念之一的闭包

闭包常常被誉为JavaScript中最难理解的概念之一,这篇文章就来带大家深入了解一下JavaScript中闭包的概念、实现与应用,需要的可以参考一下
2023-05-14

golang闭包的概念是什么

闭包是指一个函数值(函数的指针)与其引用的其环境变量(值)的组合,形成了一个整体。换句话说,闭包是一个包含自由变量(在函数中使用,但既不是函数参数也不是局部变量)的函数。在Go语言中,闭包是将函数作为返回值的一种方式。当一个函数返回时,其
2023-10-20

python中闭包的概念是什么

闭包是指在一个函数内部定义的函数,并且内部函数可以访问外部函数的局部变量。具体来说,闭包是由函数对象和其引用环境组合而成的实体。闭包在Python中的使用场景如下:返回函数:可以在一个函数内部定义一个函数,并将其作为返回值返回。这样,返回
2023-10-27

golang闭包的概念及作用是什么

闭包是指一个函数(匿名函数或者lambda函数)以及其相关的引用环境组合而成的实体。在Go语言中,闭包是一种特殊的匿名函数,它可以访问和操作其外部函数中的变量,并且这些变量的生命周期会被延长。闭包的作用是可以将函数作为参数传递给其他函数,
golang闭包的概念及作用是什么
2024-02-29

Python闭包的概念、形式与应用方式

本篇内容主要讲解“Python闭包的概念、形式与应用方式”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python闭包的概念、形式与应用方式”吧!闭包(Closure)是词法闭包(Lexical
2023-06-17

Golang函数式编程:探索Lambda和闭包的概念

在 golang 中,使用 lambda 表达式实现函数式编程:lambda 表达式:匿名函数,传递函数作为参数,用于简化高阶函数的使用;闭包:从包围函数捕获数据的函数,访问创建环境中的变量。实际案例:并发处理:使用 lambda 表达式并
Golang函数式编程:探索Lambda和闭包的概念
2024-05-12

Python的几个高级语法概念浅析(lambda表达式闭包装饰器)

1. 匿名函数 匿名函数(anonymous function)是指未与任何标识符绑定的函数,多用在functional programming languages领域,典型应用场合: 1) 作为参数传给高阶函数(higher-order
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录