我所理解的JavaScript闭包

来源:互联网 发布:java方法的概念 编辑:程序博客网 时间:2024/06/04 18:47

  现在自学JavaScript到了闭包的部分,看了好几遍《js高程》中有关闭包的部分,就我自己的理解,我通过举例子解释一下什么叫闭包,希望有js大神,看见我的这篇博客,能给予指导。
  首先,上定义,《js高程》中是这样定义的,“闭包是指有权访问另一个函数作用域中的变量的函数”。也就是说,闭包是函数,它的功能是可以访问另一个函数作用域中的变量。
  

function f1(){    var a = 10;    function f2(){        alert(a);    }}

上例中的f2函数就是一个简单的闭包,他可以访问另一个函数f1中的变量。如果想在函数f1的外面访问f1中的变量怎么办呢?只要将函数f2作为返回值,将f2 return出去就好了。即

function f1(){    var a = 10;    function f2(){        alert(a);    }    return f2;}var f = f1();f();

  这是表面上看到的,那闭包在内存中是怎样的呢?还是拿上面的函数举例子,首先从作用域链讲起,全局作用域 -> f1作用域 -> f2作用域;当f1函数将f2函数返回之后,f1函数的功能执行完毕,本应该在内存中将其占用的内存回收掉,但是,f2函数还没执行完,f1的作用域在f2作用域链的上面,所以只有当f2执行完后,f1函数才会被销毁。
  举个现实生活中的例子。外部函数是你的老板,内部函数是你。闭包的结构就相当于老板交给你一项工作,而在你工作的时候可以使用老板的所有资料,也就是访问外部函数的所有变量。当老板把这项任务交给你的时候,老板的工作基本上就已经完成了,也就是外部函数执行完成,此时老板就可以休息了吗?当然不是,他还要审查你的工作,检查你的进度,在这的意思仅仅是老板不会离职,也就是外部函数此时不会被销毁,只有当你把工作完成,他的工作也就全部完成了,此时,你们两个就都可以休假了,也就是内部函数、外部函数全部被销毁。有时候呢,老板会把你外派出去,也就是将内部函数return出去,把你派到哪,就看在哪接收你,如果内部函数中有this,派给谁,this就指向谁。
   还是上代码
  

var name = '张三';var person1 = {    name:'李四',    sayName:function(){        return function(){            return this.name;        }    }}var person2 = {    name:'王五',    sayName:person1.sayName()}var sayName = person1.sayName();console.log(sayName());   //张三console.log(person2.sayName());  //王五console.log(person1.name);  //李四

上面的代码举得有点失败,因为我不知道怎么通过person1中的sayName函数返回person1的name。
以上就是我所理解的JavaScript闭包,如果有不对的地方,希望您能提出来,共同进步。

0 0
原创粉丝点击