闭包的概念及应用
- 什么是闭包?
简单来说,闭包就是函数嵌套函数,目的是为了访问一个函数中的局部变量,让这个局部变量可以全局访问,即使这个变量所在的函数被释放之后,依然可以访问。
- 为什么不使用全局变量?
造成全局污染
- 闭包原理?
是利用了浏览器的垃圾回收机制,当被销毁的内容被垃圾回收机制清除的时候,发现这个内容正在被另一个函数所使用,则这个内容将永远不被回收,长驻内存,所以会造成内存泄露。
- 闭包的优缺点?
优点:可以让一个局部变量在全局访问
缺点:由于闭包的变量是始终保存在内存中,内存消耗会变大,导致网页性能问题。在IE浏览器中可能还会导致内存泄漏等问题;故在退出函数之前,将所有变量删除。
- 如何解决内存泄露的问题?
将使用完毕的变量赋值为null
闭包的应用
模拟私有变量
const User = (function(){ //定义私有变量_password let _password = null; class User{ constructor(username,password){ //初始化私有变量_password _password = password this.username = username; } login(){ console.log(this.username,_password); } } return User; })(); let user = new User('小明',123); console.log(user.username); //小明 console.log(user.password); //undefined console.log(user._password); //undefined user.login(); //小明 123 <script> let Person = (function(){ //创建一个私有属性 let user = null; class Person{ constructor(name,age,gender){ user = name; this.age = age; //公有属性 //私有属性 let sex = gender; } showName(){ return user; } showAge(){ return this.age; } } return Person; })(); //创建ps对象 let ps = new Person('张三',18); console.log(ps.user); //undefined console.log(ps.age); //18 console.log(ps.showName(),ps.showAge()); //'张三' 18 console.log(ps.sex); //undefined </script>