闭包

1,351 阅读1分钟

什么是闭包

声明在函数内部,可以访问函数的局部变量的函数

//方法一
let p2=(function(){
	let num=100
    return function(){
    	return num
    }
}())
p2()

闭包的作用

提升变量生命周期

变量的生命周期:从变量的声明到变量的回收。 局部变量是:从声明这个变量到这个函数执行结束 全局变量:js代码从开始执行到执行结束 提升变量生命周期 本来要要回收,结果没回收

function fn(){
	let num=10
    function add(){
    	console.log(num)
    }
    function rem(str){
    	let str1=str>0?str:0
    }
    return{
    	getNum:add,
        setNum:rem
    }
}
let p1=fn()//返回一个对象,这个对象里有两个方法
p1.getNum()

声明私有属性

//闭包可以声明私有属性
//以前写构造函数
function Student(name,age){
	this.name=name
    this.age=age
}
//实例化学生对象:name和age等属性  可以直接对象访问
let s1=new Student('jack',20)
console.log(s1.name)
console.log(s1.age)

//声明私有属性的构造函数
function Student(name){
	let age=20
    this.name=name
    //对age做操作的方法
    this.setAge=function(value){
    	if(value>=0&&value<=100){
			age=value
    }
    this.getAge=function(){
    	return '我的年龄不方便透露....'
    }
}
//实例化一个学生对象:学生对象不能访问age,必须要通过setAge()和getAge()方法
let s2=new Student('luck')
console.log(s2.name) //luck
console.log(s2.setAge())//20

闭包的使用注意

//如果你希望函数内部的局部变量每一次使用都是同一个,那外部的函数只能调用一次
function outer(){
	let num=Math.floor(Math.random()*100)
    function inner(){
    	console.log(num)
    }
    return inner
}
let fn=outer()
fn()
fn()

outer()()
outer()()