js 函数的闭包


 

 

闭包

闭包

任何的书,讲闭包,一定是下面的经典案例:

1  function outer(){

2  var a = 333;

3  function inner(){

4  console.log(a);

5  }

6  return inner;

7  }

9  var inn = outer();

10  inn(); //弹出333

 

推导过程:

我们之前已经学习过,inner()这个函数不能在outer外面调用,因为outer外面没有inner的定义:

1  function outer(){

2  var a = 888;

3  function inner(){

4  console.log(a);

5  }

6  }

//在全局调用inner但是全局没有inner的定义,所以报错

8  inner();

但是我们现在就想在全局作用域下,运行outer内部的inner,此时我们必须想一些奇奇怪怪的方法。

 

有一个简单可行的办法,就是让outer自己returninner

1  function outer(){

2  var a = 333;

3  function inner(){

4  console.log(a);

5  }

return inner; //outer返回了inner的引用

7  }

9  var inn = outer(); //inn就是inner函数了

10  inn(); //执行inn,全局作用域下没有a的定义

11  //但是函数闭包,能够把定义函数的时候的作用域一起记忆住

12  //能够输出333

这就说明了,inner函数能够持久保存自己定义时的所处环境,并且即使自己在其他的环境被调用的时候,依然可以访问自己定义时所处环境的值。

 


一个函数可以把它自己内部的语句,和自己声明时所处的作用域一起封装成了一个密闭环境,我们称为闭包Closures)。

 

每个函数都是闭包,每个函数天生都能够记忆自己定义时所处的作用域环境。但是,我们必须将这个函数,挪到别的作用域,才能更好的观察闭包。这样才能实验它有没有把作用域给“记住”。 

我们发现,把一个函数从它定义的那个作用域,挪走,运行。嘿,这个函数居然能够记忆住定义时的那个作用域不管函数走到哪里,定义时的作用域就带到了哪里。这就是闭包。

 

闭包在工作中是一个用来防止产生隐患的事情,而不是加以利用的性质。

因为我们总喜欢在函数定义的环境中运行函数。从来不会把函数往外挪。那为啥学习闭包,防止一些隐患,面试绝对考。

 

闭包的性质

每次重新引用函数的时候,闭包是全新的。

1  function outer(){

2  var count = 0;

3  function inner(){

4  count++;

5  console.log(count);

6  }

7  return inner;

8  }

10  var inn1 = outer();

11  var inn2 = outer();

12 

13  inn1(); //1

14  inn1(); //2

15  inn1(); //3

16  inn1(); //4

17  inn2(); //1

18  inn2(); //2

19  inn1(); //5

 

无论它在何处被调用,它总是能访问它定义时所处作用域中的全部变量

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM