关于闭包的理解

发表一下关于闭包的理解:
首先把每一个函数看成一个一个的“小黑屋”小黑屋里面可以看到外面的东西,但外面却看不到小黑屋里面的东西,就好比是函数可以访问外面全局变量,但是外面却访问不了“小黑屋”里面的变量;变量分为全局变量和局部变量;
列:函数可以访问外面全局变量
  var a=1;
  function fun1(){
    alert(a);
  }
fun1(); // 1

列:外面却访问不了“小黑屋”里面的变量
  function fun2(){
    var a=2;
  }
  alert(a); // a is not defined
但是如果想取到“小黑屋”内部的变量怎么办呢?自然一种叫闭包的东西出来了。
闭包就是可以访问函数内部变量的函数;
闭包就是函数内部嵌套函数,里层函数就叫闭包;
再说一下链式作用域:子函数中可以访问父函数的所有变量。当然也包括全局变量window(一般的函数定义function a(){},其实都是window对象的子函数)
开始举例:因为有链式作用域fun2可以获取到fun1的变量a,所以把fun2当做fun1的返回值不就相当于在最外面可以获取到fun1内部的东西了吗,(记住你的初衷是想获取fun1”小黑屋”内部的东西才引入的fun2)
  function fun1(){
    a=1;
    return function fun2(){
       alert(a);
     }
}
alert(fun1())

Alert出了fun1的返回值是一个函数再次执行返回的函数即fun1()()
Alert(fun1()())

你最初的想法是想获取小黑屋里面的a但一般是不可以的,用了闭包发现可以了,这就是闭包的作用。闭包还有一个作用因为他可以把函数内部的东西变为全局的东西,不让垃圾回收机制回收a一直在内存中存在,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题;
测试一下自己吧:
var name = "The Window";
var object = {
    name : "My Object",
    getNameFunc : function(){
        return function(){
         return this.name;
      };
     }
};
alert(object.getNameFunc()());
知道输出结果吗?不知道的跟我一步一步来分析吧,首先是定义了一个叫name的字符串,和定义了一个object对象,对象里面有两个属性name和getNameFunc,而getNameFunc后面就是咱们之前说的闭包(内外层函数嵌套),这可以看明白吧,object.getNameFunc()()的意思就是上面例子的fun1()(),至于内层函数的this是指向window的即window.name即正确答案是"The Window"; 如果你答案是"My Object"那应该题目是this.object.name,
参考借鉴:http://www.jb51.net/article/24101.htm

时间: 2024-12-28 02:31:22

关于闭包的理解的相关文章

闭包的理解

闭包的理解, wondow.onload=function  aaa(){   //父函数 var a=12;//局部变量 function  bbb(){   //子函数 alert(a);  //子函数可以使用父函数的局部变量,这种现象叫做闭包,是变量作用域的一种形式. } bbb() }

javascript中重要概念-闭包-深入理解

在上次的分享中javascript--函数参数与闭包--详解,对闭包的解释不够深入.本人经过一段时间的学习,对闭包的概念又有了新的理解.于是便把学习的过程整理成文章,一是为了加深自己闭包的理解,二是给读者提供学习的途径,避免走弯路. 在javascript--函数参数与闭包--详解这篇文章中,我详细介绍了闭包的概念.以下的分享对闭包的基本概念只会稍稍带过.如果对闭包的概念不熟悉的同学,请移步至javascript--函数参数与闭包--详解. 以下的分享会分为如下内容: 1.let命令 2.闭包特

javascript 闭包的理解

看过很多谈如何理解闭包的方法,但大多数文章,都是照抄或者解释<Javascript高级程序设计(第三版)>对于闭包的讲解,甚至例程都不约而同的引用高程三181页‘闭包与变量’一节的那个“返回数组各个项,结果各个项的值都相同”的例程,还有些文章的讲解过程上一步与下一步之间的跨度简直就是一步登天,让人反复看半天都无法理解. 闭包的理解需要很多概念做铺垫,包括变量作用域链.执行环境.变量活动对象.引用式垃圾内存收集机制等,如果对本文涉及的这些概念不理解,可以去找本<Javascript高级程序

作用域+闭包+this理解

函数预解析过程   函数会覆盖同名变量 也就是var  他的优先级高   如果是同名函数则后者覆盖前者   逐行解读代码的时候 表达式 和参数 会改变预解析仓库里面的值..也就是表达式能干掉函数   域和域之间的关系 <script>标签存在上下文关系   走完上下文标签的变量  下面的可以用上面的   自上而下  函数  json等 子级作用域到父级作用域的过程 叫作用域链        由里到外 当子级找不到变量 会到父级找  如果有表达式的话就会更改全局变量 也就是函数里面没有var  

闭包的理解学习

闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 下面就是我的学习笔记,对于Javascript初学者应该是很有用的. 一.变量的作用域 要理解闭包,首先必须理解Javascript特殊的变量作用域. 变量的作用域无非就是两种:全局变量和局部变量. Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量. var n=999; function f1(){ alert(n); } f1(); // 999 另一方面,在函数外

第二话:javascript中闭包的理解

闭包是什么? 通过闭包,子函数得以访问父函数的上下文环境,即使父函数已经结束执行. OK,我来简单叙述下,先上图. 都知道函数是javascript整个世界,对象是函数,方法是函数,并且js中实质性的面向对象相关也都是函数来实现和延伸,例如:"类". window:是指js中window类,也是js最高一层,因为什么这么说,因为你所有创建的方法和属性其实都在window之内.window中的所有方法,在自己创建的方法中都可以调到.可以仔细想想alert,在任何地方都可以alert,其实

个人对js闭包的理解

闭包算是前端面试的基础题,但我看了很多关于闭包的文章博客,但感觉很多对于闭包的理想还是有分歧的,现在网上对闭包的理解一般是两种: 有些文章认为闭包必须要返回嵌套函数中里面用到外面函数局部变量的方法才叫闭包,有两个条件:1).函数嵌套,内部函数要用到外部函数的局部变量 2).内部函数必须返回 有些文章认为只要函数嵌套内部函数用到了外部局部变量就是闭包,不要返回内部函数 我们先看看闭包的定义到底是什么,然后在来分析我在学习js的时候不同阶段对闭包的误解.在<javascript高级程序设计中>对闭

闭包的理解(可能有误,大神看到如果有问题请纠正)

对于闭包的理解,主要有两个作用 1.外部方法应用内部方法的变量,2.缓存数据 function a() { var i = 0; function b() { alert(++i); } return b; } var c = a(); c();//1 c();//2 其中的c是一个window全局方法,它能调用方法a里面的b方法,注意a是返回了一个内部函数b,如果不这样,那c就不能调用b了: a中有一个变量i,为什么第一次调用c它是1,第二次时2,因为c是一个全局对象,一直保存在内存中 看以下

JavaSript中变量的作用域 闭包的理解

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> <script type="text/javascript"> /* * 1.js中的变量都是公用的. 2.js中没有静态变量 3.闭包:函数内部可以调用函数外部的变量;反之,则不行 */ var r=10; fu