Js基础-闭包

这篇具有很好参考价值的文章主要介绍了Js基础-闭包。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在介绍闭包之前,我们先看看是什么全局变量和局部变量

全局变量和局部变量

局部变量:定义在函数内部的变量(只能在内部被访问) 形参也是一种局部变量

全局变量:不在函数内部定义的变量, 就称为全局变量,全局变量在任何函数内都可以被访问和修改

假如我们在函数内部 定义了一个和外部相同名字的变量, 那么在函数内部是用的哪个变量呢?

<script>
    var ccc = 5;
    function inner() {
        var ccc = 4;
        console.log(ccc);
    }

    inner();

  </script>

以上结果会输出4 , 因为在执行过程中, 会由内向外寻找变量的定义,所以局部变量在函数内部比全局变量更有优先被使用的权力

再看一个例子, 假如我们打印外部的ccc变量会输出什么?

<script>
    var ccc = 5;
    function inner() {
        var ccc = 4;
    }

    inner();

    console.log(ccc);

</script>

上面的例子会输出 5, 因为函数内部定义的变量无法被外部看到

我们再来看一个比较奇葩的例子

<script>
    var ccc = 5;
    function inner() {
        ccc += 1;
        var ccc = 4;
        console.log(ccc);
    }

    inner();

</script>

这个例子第一次打印会输出 NaN , 第二次打印会输出 4

第二次打印好理解, 因为我们已经知道局部变量优先被使用。

第一次比较奇怪, 按道理讲, 在函数内部也应该能引用到外部的全局变量ccc,但是程序的运行结果和我们的推断相反,这是因为js语言有个比较坑的知识点;即在函数执行前,语法规定把变量的定义提升到 函数的前面。

上面的例子在运行的时候浏览器是这么理解的

<script>
    var ccc = 5;
    function inner() {
				var ccc = undefined;
        ccc += 1;
        ccc = 4;
        console.log(ccc);
    }

    inner();

</script>

这种特性就叫做函数变量提升, 把一个后面定义变量, 提升到前面,因为前面有这个地方的引用。

局部函数

一个函数内部也可以定义另一个函数内部

<script>
        function outer() {

            function inner() {
                console.log("innser函数")
            }

            inner()

        }

        outer();
  </script>

上面的inner() 函数只能再 outer() 函数内部调用

特别注意

如果不加修饰词定义一个变量的话, 此变量将被视为全局变量,即使它定义在了函数内部

<script>

        function fa() {
            quanju = 10;
        }
        fa();
        console.log(quanju);

    </script>

闭包

概念

从概念上讲,闭包就是一个函数以及捆绑在此函数周围环境状态的引用组合, 每创建一个函数都会产生一个闭包

这个定义比较抽象,下面,我们举个栗子

<script>
      function outter(){
					
					var cons = '常量小常'
          
          return function() {
              return cons;
          } 
      }
			
			// 得到外部函数的内部函数
      var consFun= outter(1,2);
      // 执行内部函数
      consFun();
</script>

这个例子最终会输出 ‘常量小常’, 虽然内部函数是在外部执行的, 但它依然能够找到定义时候的一些常量值。这个就是一种闭包的表现形式

Untitled.png

换句话说,就是函数在执行的时候,能够还原它定义时所处的环境,能够按照定义时候的样子去执行

模拟私有变量

很多语言都支持私有变量, 就是将一个变量或者方法声明为私有,只能被内部使用,外部要想使用只能通过定义的一些公共方法访问

Js原生不支持这种语法,但可以通过闭包模拟这种私有变量的特性

下面就是一个闭包模拟私有变量的例子 , privateCounter  变量不能直接被外部访问,只能通过特定的方法操作。这个例子来源于此:

用闭包模拟私有变量

https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Closures#用闭包模拟私有方法文章来源地址https://www.toymoban.com/news/detail-709777.html

<script>
      var Counter = (function () {
      var privateCounter = 0;
      function changeBy(val) {
          privateCounter += val;
      }
      return {
          increment: function () {
          changeBy(1);
          },
          decrement: function () {
          changeBy(-1);
          },
          value: function () {
          return privateCounter;
          },
      };
      })();

      console.log(Counter.value()); /* logs 0 */
      Counter.increment();
      Counter.increment();
      console.log(Counter.value()); /* logs 2 */
      Counter.decrement();
      console.log(Counter.value()); /* logs 1 */

  </script>

到了这里,关于Js基础-闭包的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 升级iPhone 15 Pro Max还是等待下一代?看看我们的比较分析!

    对于拥有13 Pro Max并即将结束两年合同的用户,或者任何想看看是否值得购买两年前非常好的旗舰iPhone的最新机型的人来说,分解iPhone 15 Pro Max与iPhone 13 Pro Max的差异非常重要。无论你的动机是什么,我们都会帮助你找到答案。 iPhone 15 Pro Max还没有发布,但很快我们就会知道哪

    2024年02月13日
    浏览(44)
  • TeamView: 为了进一步增强安全性,在发起连接之前,我们希望您先验证您的账户

    TeamViewPC端远程连接另外一台电脑 弹出窗口:为了进一步增强安全性,在发起连接之前,我们希望您先验证您的账户 电脑浏览器自动跳转到手机号验证页面,输入正确的手机号后,点击验证却一直提示 手机号无效、手机号未知等异常。 复制验证链接到手机 https://login.teamviewer.

    2024年02月14日
    浏览(65)
  • 字节一面:闭包是什么?闭包的用途是什么?

    前言 最近博主在 字节面试 中遇到这样一个面试题,这个问题也是前端面试的高频问题,因为在前端开发的日常开发中我们经常会用到闭包,我们会借助闭包来封装一些工具函数,所以更深的了解闭包是很有必要的,博主在这给大家细细道来。 🚀 作者简介:程序员小豪,全

    2024年02月11日
    浏览(35)
  • js内存管理与闭包

    ◼ 不管什么样的编程语言,在代码的执行过程中都是需要给它分配内存的,不同的是某些编程语言需要我们自己手动的管理内存, 某些编程语言会可以自动帮助我们管理内存: ◼ 不管以什么样的方式来管理内存,内存的管理都会有如下的生命周期:  第一步:分配申请你

    2024年02月08日
    浏览(40)
  • 浅析js中的闭包

    闭包 指那些引用了另一个函数作用域中变量的函数,通常是在嵌套函数中实现的。 闭包形成的原理 : 作用域链 。只要是代码都一个作用域中,写在函数内部的局部作用域,未写在任何函数内部即在全局作用域中;如果函数中还有函数,那么在这个作用域中就又可以诞生一

    2024年01月23日
    浏览(41)
  • 「为什么代码要整洁?」——代码整洁度对于项目质量的影响,让我们通过这边文章来教你js和ts的代码整洁技巧,让你的项目更出众

    为什么代码要整洁? 代码质量与整洁度成正比。有的团队在赶工期的时候,不注重代码的整洁,代码写的越来越糟糕,项目越来越混乱,生产力也跟着下降,那就必须找更多人来提高生产力,开发成本越来越高。 整洁的代码是怎样的? 清晰表达意图、消除重复、简单抽象、

    2024年02月07日
    浏览(69)
  • Js面试之作用域与闭包

    最近在整理一些前端面试中经常被问到的问题,分为vue相关、react相关、js相关、react相关等等专题,可持续关注后续内容,会不断进行整理~ 作用域(scope)定义了程序中变量的可访问性和生命周期,在js中,作用域有两种主要的类型:词法作用域(Lexical Scope)和动态作用域(

    2024年01月19日
    浏览(39)
  • 闭包是什么?有什么特性?对页面有什么影响?

    闭包是指一个函数能够访问并操作在其词法作用域之外的变量的能力。在 JavaScript 中,函数可以作为变量传递,当一个函数嵌套在另一个函数内部,并且内部函数可以访问外部函数的变量,那么内部函数就形成了一个闭包。 闭包有以下几个特性: 内部函数可以访问外部函数

    2024年01月17日
    浏览(39)
  • JavaScript闭包详细介绍

    闭包是指有权访问另一个函数作用域中的变量的函数,创建闭包的常见方式是让一个内嵌函数访问其外部(父级)函数的变量,即使外部函数已经执行完毕,其变量仍然存在于内存中。闭包的主要特点是它可以“记住”外部函数的变量。 变量持久化: 闭包能够保持对外部作

    2024年02月20日
    浏览(30)
  • node.js 什么是模板引擎?(具体介绍underscore)

    前言:在 Web 开发中,数据的呈现通常是基于 HTML 和 CSS 的,而数据的变化又是非常频繁的,需要根据数据动态生成 HTML 标记。手动拼接 HTML 标记显然是一种非常低效的方式,不仅容易出错,而且难以维护。使用,我们使用到了模板引擎来解决这一问题。  模板引擎是一种将数

    2024年04月23日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包