闭包

60 阅读2分钟

1 什么是闭包?

什么是闭包?

MDN的官方解释:

闭包是函数和声明该函数的词法环境的组合

更通俗一点的解释是:

内层函数, 引用外层函数上的变量, 就可以形成闭包

需求: 定义一个计数器方法, 每次执行一次函数, 就调用一次进行计数

let count = 0
function fn () {
  count++
  console.log('fn函数被调用了' + count + '次')
}
fn()

这样不好! count 定义成了全局变量, 太容易被别人修改了, 我们可以利用闭包解决

闭包实例:

function fn () {
  let count = 0
​
  function add () {
    count++
    console.log('fn函数被调用了' + count + '次')
  }
​
  return add
}
const addFn = fn()
addFn()
addFn()
addFn()

2.闭包的作用

2.1提升变量的生命周期.

//1.闭包的作用01-提升变量的生命周期.

//就是说可以在函数外部访问函数内部的局部变量.

//2.变量生命周期: 从变量的声明到变量的回收.

//2.1 局部变量:从声明他开始到 声明他的那个函数执行完毕结束.

functiontest(){

varnum1;

console.log('哈哈');

num1=10;

console.log('呵呵');

console.log(num1);

}

test();

console.log(num1);//报错了 num1 is not defined, 因为变量已经被回收了

//2.2 全局变量:

//从声明出来开始,到程序结束(页面关闭).

//3.提升变量的生命周期.

//本来要回收的,结果没有回收.

functiontest(){

varnum1=10;

functiontest2(){

console.log(num1);

   }

returntest2;

}

varfn=test();//调用test函数,会有一个函数作为返回值.就是test2函数.

fn();//调用fn,相当于调用test2函数.

2.2 提供有限的访问权限

//1.闭包的作用02-提供有限的访问权限.

functiontest() {

varnum=10;

functiongetNum() {

returnnum;

   }

functionsetNum(value) {

//这里是一个函数,既然是函数就可以在这里写任意的代码.

//就可以写对这个num做赋值逻辑过滤的代码

if(value>=0&&value<=140) {

num=value;

       }

   }

return{

getNum:getNum,

setNum:setNum

   }

}

varobj=test();//调用test函数,会返回一个对象,这个对象里面有2个方法: 一个是getNum,一个是setNum

obj.setNum(1000);

console.log(obj.getNum());

2.3 声明私有属性

//闭包的作用03-可以声明私有属性

//01:以前写构造函数

functionStudent(name,age){

this.name=name;

this.age=age;

}

//实例化学生对象: name和age等这些属性 可以直接对象访问.

vars1=newStudent('龙翔',20);

console.log(s1.name);

console.log(s1.age);

//02: 声明私有属性的构造函数

functionStudent(name){

varage=10;//局部变量age,外面不能直接访问

this.name=name;

//对age做操作的方法

this.setAge=function(value){

//判断

if(value>=0&&value<=140){

age=value;

       }

   }

this.getAge=function(){

return"我的年龄不方便透露哦..."

   }

}

//实例化一个学生对象: 学生对象不能访问age, 必须要通过setAge()方法和getAge()方法来访问.

vars1=newStudent('豆蔻');

console.log(s1.name);

s1.setAge(20);

console.log(s1.getAge());//20

\