zoukankan      html  css  js  c++  java
  • 关于闭包的理解

    发表一下关于闭包的理解:
    首先把每一个函数看成一个一个的“小黑屋”小黑屋里面可以看到外面的东西,但外面却看不到小黑屋里面的东西,就好比是函数可以访问外面全局变量,但是外面却访问不了“小黑屋”里面的变量;变量分为全局变量和局部变量;
    列:函数可以访问外面全局变量
      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

  • 相关阅读:
    [pyqt] 基于特征匹配的动漫头像检索系统(一)
    [python] 简单遗传算法与粒子群算法
    [美化] 博客园美化历程
    [同人] 我的莱昂
    数据结构 结语
    灌水机
    Ubuntu 中linux 编译错误的(-)
    目标抓取全站妹子封面图片全部爬下来以图片标题命名
    Makefile 介绍
    Linux 中的 ~/. 表示的意思
  • 原文地址:https://www.cnblogs.com/MagicZhao123/p/6031792.html
Copyright © 2011-2022 走看看