什么是closure?

Closure是一种内存泄漏的情况,当一个函数被内嵌在另外一个函数中时,这个函数会形成一个闭包环境并且引用了父级别函数的变量,导致父级别函数的作用域在子级别闭包中得以保留。如果不正确使用和管理这些闭合变量,将会产生内存泄漏。

如何避免或解决closure问题?

1.?避免声明全局变量:

在代码运行期间开辟了空间但未被及时回收的全局变量很容易造成`未释放内存`。我们可以使用IIFE(立即执行函数表达式)来代替全局声明方式定义常量、单例等。

``` (function(){   var a = 1; })(); console.log(a);// 报错:a is not defined ```



2. delete操作符:

delete关键字能够对于JS对象和数组等进行赋值为undefined操作,并删除该属性占用空间。此方法可以缓解Closure带来资源消耗过大问题。

``` for (var i = 0; i < arrLength; ++i){ delete parentArr[i]; } ```



3. 函数传参应使用副本:

Javascript中基础数据类型通过复制实现传参,复杂类型则类似于让形参指向同一地址,直接影响原始数据(例如数组、对象)。因此我们最好对参数进行浅拷贝处理而不是直接将原始数据传入作为参数,在保证业务逻辑正确下减少因外部调用修改导致出现意外结果的可能性,P.S 在ES6之后提供了Object.assign() 及其展开运算符完成深度拷贝,

``` function copy(obj) { var newobj = {}; for ( var attr in obj) { newobj[attr] = obj[attr]; } return newobj; } ``` <\body