iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Javascript的独特的概念之闭包
  • 568
分享到

Javascript的独特的概念之闭包

2024-04-02 19:04:59 568人浏览 薄情痞子
摘要

目录javascript闭包简介:为什么是闭包:总结Javascript闭包简介: Javascript语言中,有一个独特的概念:闭包(closure),这在类似c++,Java等编

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

--结束END--

本文标题: Javascript的独特的概念之闭包

本文链接: https://www.lsjlt.com/news/140865.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • c语言怎么计算字符串长度
    在C语言中,可以使用内置的strlen()函数来计算字符串的长度。该函数位于string.h头文件中。以下是一个示例代码: #inc...
    99+
    2024-05-14
    c语言
  • c语言怎么判断三个数的大小
    可以通过比较三个数之间的大小关系来判断它们的大小。以下是一个示例代码: #include <stdio.h> int ...
    99+
    2024-05-14
    c语言
  • c++排序函数sort怎么使用
    在C++中,使用sort函数对容器中的元素进行排序,可以按照默认的升序排列,也可以自定义排序规则。 下面是一个简单的例子,对一个ve...
    99+
    2024-05-14
    c++
  • c++中string的compare函数怎么使用
    在C++中,可以使用string的compare函数来比较两个string对象的大小。该函数的原型如下: int compare(c...
    99+
    2024-05-14
    c++
  • c++中string的compare函数有什么用
    c++中string的compare函数用于比较两个字符串的大小关系。该函数返回一个整数值,表示两个字符串的比较结果。 具体来说,如...
    99+
    2024-05-14
    c++
  • c++中print函数的功能有哪些
    在C++中,通常使用std::cout来进行输出操作,而不是使用print函数。std::cout是C++标准库中的一个输出流对象,...
    99+
    2024-05-14
    c++
  • c语言数据结构怎么使用
    在C语言中,数据结构可以通过定义结构体来实现。以下是一些常见的数据结构的使用方法示例: 链表: #include <std...
    99+
    2024-05-14
    c语言
  • c++中print函数的用法是什么
    在C++中没有内置的print函数,但可以使用cout来输出内容到控制台。cout是C++标准库中的一个输出流对象,可以使用<...
    99+
    2024-05-14
    c++
  • c++中concept的用法是什么
    在C++20中,Concept是一种新的语言特性,用于定义类型要求和约束。Concept可以被用来约束函数模板、类模板和普通函数的参...
    99+
    2024-05-14
    c++
  • c++中concept的作用是什么
    在C++中,concept的作用是定义一种通用的约束,用于限制模板参数的类型范围。通过使用concept,可以在编译时对模板参数进行...
    99+
    2024-05-14
    c++
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作