当前位置: 首页 > 网络应用技术

在 - 深入理解JS关闭

时间:2023-03-07 14:09:49 网络应用技术

  在阅读本文之前,让我们做两个思考问题,这有助于我们深入了解封闭。这也是我今天发现的一个更有趣的问题。让我们来看看:

  因为当变量测试和nADD在函数内声明时未使用var命令,所以当函数fun1执行时,这两个变量是要声明的全局变量

  我看到Internet上的一些博客作者说,关闭是嵌套功能中的内部功能,一些博客作者说,关闭是嵌套功能的外部功能。从上面的栗子的角度来看,显然这是一个不准确的陈述。官方定义更准确。让我们看一下官方定义:

  闭合是功能和声明功能环境的组合。

  让我们来看看官方的例子:

  显然,这里有嵌套功能,嵌套内部功能的内部功能使用外部功能的变量,因此会生成封闭。如果根据官方定义可以理解它,则此处的关闭是指从makefunc函数到返回语句的句子的第一个句子。

  如果我看上面的一堆我该怎么办?

  首先,为了真正了解关闭,我们必须了解JavaScript的特殊变量范围(特别是您可以参考我的上一篇文章,以深入了解JS动作域和范围链)。JavaScript的特殊功能之一在于其可变访问访问:

  1.可以直接读取函数内的全局变量

  2.函数中的局部变量无法在功能之外读取

  但是,这里有一个值得关注的地方。当内部声明该函数时,您必须使用var命令。如果不是,您实际上声明了一个全局变量!(补充:函数内部的全局变量称为隐藏声明)

  3.内部功能可以访问外部功能的变量

  当使用JS进行编程时,有时我们需要在功能之外的功能内部获取本地变量,但是在正常情况下,我们已经说过这是不可能的。IS,在函数内定义了一个函数。

  在上面的代码中,函数fun2包含在函数fun1中。目前,Fun1可以看到Fun1内部的所有局部变量。但是,FUN2不可见fun2中的局部变量。这是JavaScript语言独有的链范围。子对象将查找所有父对象级别的变量。Summary:sub -objects均可看到父对象的所有变量,反之亦然。

  这样,我们可以访问函数Fun1中的变量,但是问题出现了。我们不能从外部调用函数fun2。因此,我们应该如何在外部访问fun2。这样,我们可以访问fun1外部fun1中的变量,如下:

  关于关闭的概念,我们已经说过官员给出的定义。尽管给出的官方定义更准确,但对于初学者来说是晦涩难懂的。理解是,闭合是可以读取其他功能的其他内部变量的函数。本质上,闭合是连接内部和外部功能的桥梁。

  尽管我们还说关闭不是一个功能,而是为了促进理解和学习,我们通常可以将闭合称为功能,但是我们必须始终记住,封闭不是一个功能,而是一个功能,而是声明的功能和声明应该是这种情况。功能的功能环境的组合,该环境包含创建关闭时可以访问的所有局部变量。记住,这是一个组合!组合!

  如果要使用封闭,则必须知道其结构,这也是它的条件:

  以及关闭的作用:

  现在,让我们分析和分析本文给出的主题。为了促进观察,我将在此处插入该代码:

  在此代码中,结果实际上是闭合fun2函数。它总共运行两次,第一个值为999,第二个值为1000。这证明了函数fun1中的局部变量n已保存在内存中,并且执行FUN1调用后,不会自动清除。

  这种情况的原因是Fun1是Fun2的父亲功能,FUN2通过FUN1的返回声明将FUN2分配给全球变量,这会导致FUN2IN内存,它不会被通话结束后的垃圾回收机制所回收。

  另外,应注意的是,“ nadd = function(){n+= 1}”是第一个。首先,var关键字未在NADD的前面使用,因此NADD是一个全局变量,而不是局部变量。第二,NADD的值是匿名函数,匿名函数本身也是一个封闭的软件包,因此NADD CAN可以操作功能外部功能内部的局部变量。

  使用关闭时注意:

  对关闭的理解在这里。我希望这对每个人的理解都会有所帮助。如果您什么都不了解,请在评论区域留言。作者将一一回答。不要害怕关闭。尽管关闭很困难,但封闭确实很重要。值得学习。尽管封闭在开发过程中很少使用,但在使用时几乎不会被其他方式所取代。对于所有关键字,例如永久性的保护,例如永久性,保护均已关闭。

  原始:https://juejin.cn/post/7097141521102667813