首页 弘成IT资讯

你是怎么理解闭包的呢

2019-12-17 弘成IT
分享到:

  闭包(closure)是javascript的一大难点,也是它的特色。很多高级应用都用依靠闭包来实现。

  要理解闭包可以分为下面五部分

  1. 变量作用域

  2. 如何从外部读取函数内部的变量

  3. 闭包的概念

  4. 闭包的用途

  5. 使用闭包的时候的注意事项

  一、javascript的变量作用域

  要理解闭包,首先要理解javascript的特殊的变量作用域。

  变量作用域无非两种;全局变量和局部变量。

  Javascript语言的特别之处就在于;函数内部可以直接读取全局变量,但是在函数外部无法读取函数内部的局部变量。Javascript的作用域其实就是当你在使用一个变量的时候。,先在自己的作用域上查找,如果没有找到,再到父级作用域去查找,一直找到全局作用域,如果全都没有找到即为报错

  注意点:在函数内部声明变量的时候,一定要用var 获取let来声明。如果不用的话你声明的其实是个全部变量

  二、如何从外部读取函数内部的局部变量?

  有些时候可能业务需求,我们需要获取到函数内部的局部变量,但是上面已经说过了,正常情况下是办不到的,但是我们可以通过一些方法实现比如我们在函数的内部再定义一个函数

 function foo(){
  var a=10
  console.log(b)
 function foo2{
  var b=10
  console.log(a)     //10
}
foo2()
}

  我们来看一下上面的代码,函数foo2就被包括再函数foo中,而我们再执行foo2函数的时候可以得到a变量,而我们在执行函数foo的时候会报错,这就是javascript语言的特有的‘链式作用域’结构,子对象会一级一级的向上查找所有父对象的变量。所以父对象的所有变量,对子对象都是可见的,反之则不成立。

  既然foo2函数可以读取foo函数中的局部变量,那么我们只要把foo2作为返回值,我们不就可以在foo外部读取他内部的变量了嘛!

  三、闭包的概念

  上面代码中的foo2函数就是闭包。

  在一些书籍还有科博中对闭包定义的都很抽象,我对闭包的理解其实就是:闭包能够读取其他函数内部变量的函数。

  由于在javascript中,只有函数内部的子函数才能读取局部变量,所以说,闭包可以简单理解为定义在一个函数内部的函数。

  所以在本质上,闭包就是将函数内部和函数外部连接起来的桥梁。

  四、闭包的用途

  闭包可以用在许多地方。它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中,不会在f1调用后被自动清除。

  为什么会这样呢?原因就在于foo是foo2的父函数,而foo2被赋给了一个全局变量,这导致foo2始终在内存中,而foo2的存在依赖于foo,因此foo也始终在内存中,不会在调用结束后,被垃圾回收机制(garbage collection)回收。

  五、使用闭包的注意点

 (1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。

(2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象,使用,把闭包当作它的公用方法,把内部变量当作它的私有属性,这时一定要小心,不要随便改变父函数内部变量的值。

弘成IT版权与免责声明
1、凡本网站注明稿件来源为:弘成IT的所有文字、图片和音视频稿件,版权均属本网站所有,任何媒体、网站或个人未经本网协议授权不得转载、链接、转贴或以其他方式复制发表。已经本网协议授权的媒体、网站,在下载使用时必须注明“稿件来源:弘成IT”,违者本网将依法追究责任。
2、本网注明稿件来源为其他媒体的文/图等稿件均为转载稿,本网转载出于非商业性的教育和科研之目的,并不意味着赞同其观点或证实其内容的真实性。如转载稿涉及版权等问题,请作者在两周内速来电或来函联系。