-
闭包是什么
指的是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分,通俗来讲就内部的变量引用外部的变量 -
闭包形成的原因:
外层函数的函数作用域对象,因为被内层函数作用域引用这无法释放,就成了闭包 -
闭包的原理
基于函数变量作用域链的规则 和 垃圾回收机制的引用计数规则。在说说什么是垃圾回收机制和变量作用域链:
垃圾回收(Garbage Collection,GC),顾名思义就是释放垃圾占用的空间,防止内存泄露。有效的使用可以使用的内存,对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收。
作用域链:当一个块或函数嵌套在另一个块或函数中时,就发生了作用域的嵌套。因此,在当前作用域中无法搜索到某个变量时,引擎就会在外层嵌套的作用域中继续搜索,直到搜索到该变量,或抵达最外层的作用域(也就是全局作用域)为止。这样一条有序的列表,称为作用域链,作用域链的最前端一定是当前作用域。 -
闭包的本质
JavaScript闭包的本质是内存泄漏,指定内存不释放。 -
闭包的特性
1.函数嵌套函数 2.外部变量不能访问里面的变量,内部变量可以访问外部变量 3变量不会被垃圾回收机制回收
-
闭包的优缺点
优点:
1.保护函数内的变量安全,实在封装,防止变量流入其他环境发生命名冲突
2.在内存中维持一个变量,可以做缓存(但使用多了同时也是一个缺点,消耗内存)
3.匿名自执行函数可以减少内存消耗
缺点:
(1)全局变量不会被垃圾回收机制回收,增加了内存消耗,造成内存泄漏,(解决方法是可以在使用完变量后手动为他赋值null)
2.闭包容易涉及跨域访问,会导致性能损失(解决方法把跨作用变量存储在局部变量中,直接访问局部变量,减轻对执行速度的影响)