闭包
闭包
闭包是什么?
优点和使用场景:技术难点用闭包解决
-
函数内部的变量
-
临时数据
比如for循环的i值,希望延时使用,可以使用闭包把临时数据保存到局部变脸域中
-
防止变脸污染
用闭包把业务变量放在局部作用域中
缺点以及解决方法
闭包使用不当会导致内存泄漏问题
-
内存泄漏:浏览器运行网页,就会执行js代码,引用数据会在内存中占用内存空间
-
内存管理机制:垃圾回收机制(运行过程中外部可能返回,则不会销毁),引用计数 底层浏览器的代码实现的功能
function fn() {
var obj= {age:20};
function tool() {
return obj.age;
}
return tool
}
var re = fn() // 内存泄漏,外部可以引用内部的数据,内部的obj对象不会释放
内存泄漏的解决方案
-
尽量避开 不要使用闭包
-
在可能存在泄漏的地方把标识符引用为空
function fn() { var obj= {age:20}; function tool() { return obj.age; } return tool } var re = fn() // 内存泄漏,外部可以引用内部的数据,内部的obj对象不会释放 re = null; //可能泄漏地方,标识符指定为空
-
es6的,用let来定义变量
function fn() { let obj = {age:30}; function tool() { return obj.age; } return tool; }
具有作用域的代码块
一个函数返回函数内部的工具函数,外部通过工具函数间接访问局部变量的过程
利用函数自调用,每次调用的局部变量或则形参都是独立的,来保存一些独立的,保存一些临时数据
利用函数独立作用域来生成业务代码块 内部的变量相互不冲突
function fn() {
var a = 20;
console.log(a)
}
fn()
闭包的技术的好处
-
通过业务点对闭包做区分
利用函数的作用域和运行时的作用域,函数变量外部无法访问,但可以返回一个闭包,外部操作闭包来间接访问函数内部的变量,闭包可以决定这个变量的操作方式
-
函数每次调用时生成的独立调用栈
var arr = []; function fn(index) { arr[index] = function() { console.log(index) } } for(var i = 0; i < 5; i++) { arr[i] = fn(i); } arr[0](); // 0 var arr = []; for(var i =0; i < 5; i++) { (function(index) { arr[index] = function() { console.log(index) } })(i) }
-
利用函数复用功能,制作复用工具,参数返回值