搜索

查看: 3110|回复: 11

[CSS/HTML] Javascript的独特的概念之闭包

[复制链接]
发表于 2023-5-4 16:48:43 | 显示全部楼层 |阅读模式
Editor 2023-5-4 16:48:43 3110 11 看全部
目录
  • 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
  • 回复

    使用道具 举报

    发表于 2023-6-29 00:46:50 | 显示全部楼层
    普通人物怨 2023-6-29 00:46:50 看全部
    这东西我收了!谢谢楼主!知鸟论坛真好!
    回复

    使用道具 举报

    发表于 2023-6-29 16:05:27 | 显示全部楼层
    掌舵的鱼1987 2023-6-29 16:05:27 看全部
    其实我一直觉得楼主的品味不错!呵呵!知鸟论坛太棒了!
    回复

    使用道具 举报

    发表于 2023-6-29 16:20:15 | 显示全部楼层
    计划你大爷计j 2023-6-29 16:20:15 看全部
    这东西我收了!谢谢楼主!知鸟论坛真好!
    回复

    使用道具 举报

    发表于 2023-6-29 17:40:51 | 显示全部楼层
    塞翁364 2023-6-29 17:40:51 看全部
    楼主,我太崇拜你了!我想我是一天也不能离开知鸟论坛
    回复

    使用道具 举报

    发表于 2023-6-29 19:36:49 | 显示全部楼层
    风来时狂放 2023-6-29 19:36:49 看全部
    楼主太厉害了!楼主,I*老*虎*U!我觉得知鸟论坛真是个好地方!
    回复

    使用道具 举报

    发表于 2023-6-29 23:13:16 | 显示全部楼层
    惜颜705 2023-6-29 23:13:16 看全部
    这东西我收了!谢谢楼主!知鸟论坛真好!
    回复

    使用道具 举报

    发表于 2023-6-30 07:09:35 | 显示全部楼层
    丁侦球 2023-6-30 07:09:35 看全部
    既然你诚信诚意的推荐了,那我就勉为其难的看看吧!知鸟论坛不走平凡路。
    回复

    使用道具 举报

    发表于 2023-6-30 09:46:49 | 显示全部楼层
    老橡树1 2023-6-30 09:46:49 看全部
    这东西我收了!谢谢楼主!知鸟论坛真好!
    回复

    使用道具 举报

    发表于 2023-7-3 10:31:19 | 显示全部楼层
    123456848 2023-7-3 10:31:19 看全部
    论坛不能没有像楼主这样的人才啊!我会一直支持知鸟论坛
    回复

    使用道具 举报

    • 您可能感兴趣
    点击右侧快捷回复 【请勿灌水】
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则 返回列表

    RSS订阅| SiteMap| 小黑屋| 知鸟论坛
    联系邮箱E-mail:zniao@foxmail.com
    快速回复 返回顶部 返回列表