什么是闭包
声明在函数内部,可以访问函数的局部变量的函数
//方法一
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()()