匿名函数和闭包

匿名函数,顾名思义是没有函数名称的函数。
我们先创建一个普通函数:

//普通函数
    function fn(){
        alert("我是普通函数")
    }
fn() //调用

我们接着来看匿名函数:

//匿名函数 ,单独的匿名函数无法使用,因为函数调用必须要用到函数名称
    function (){
       alert("我是匿名函数")
    } //报错

我们再来看看匿名函数的调用方法:
情况1.把匿名函数赋值给变量

    var fn1 = function(){
        alert("我是匿名函数被赋值给变量调用")
    }
    fn1();//我是匿名函数被赋值给变量调用

情况2.匿名函数自我调用,表达式的方式

    (function(){
        alert("我是匿名函数通过表达式自我执行")
    })();
//我是匿名函数通过表达式自我执行

再来看看匿名函数是如何传递参数的:
匿名函数传递参数,调用方法与上面相同

//1.赋值给变量
   var fn2 =  function (num1,num2){
        alert(num1+num2)
    };
    fn2(1000,1000);
//2. 自我调用方法
    (function(num1,num2){
        alert(num1+num2)
    })(100,100);

什么是闭包呢?
闭包的概念:
闭包就是有权(访问),(另一个函数作用域)中(变量的函数);
闭包可以简单理解成“定义在一个函数内部的函数“。所以,在本质上,闭包是将函数内部和函数外部连接起来的桥梁。
闭包的作用:
一个是前面提到的可以读取函数内部的变量,
另一个就是让这些变量的值始终保持在内存中,不会在调用后被自动清除。

闭包的概念不太好理解,但是通过一些例子还是很好理解的;
闭包的用途1,读取函数内部的变量
例子1:

   function myfun(){

        return function (){

            return("你用闭包的方式访问到我1")
        }
    }
    alert(myfun);    //输出myfun整个函数表达式
    alert(myfun());  //输出匿名函数表达式

  //闭包调用方式1
      alert(myfun()());

 //闭包调用方式2
     var a = myfun(); //赋值给变量
       alert(a())

例子2.通过闭包访问局部变量

   function myfun2(){
        var a = "你用闭包的方式访问到我2";
        return function (){
            return a;
        }
    }
    //闭包调用方式1
    alert(myfun2()())
    //闭包调用方式2
    var b = myfun2();
    alert(b());

通过上面两个例子相信就大家就能看出来闭包的作用和使用方法。是不是很简单。
闭包的作用2
可以让局部变量始终保持在内存中
例子1:
首先来看简单的累加应用:

    var num = 1; //通过全部变量来实现
    function add() {
        alert(num++)
    }
    add();//1 每次调用的时候全局变量都会进行++,这样就实现了累加
    add();//2
    add();//3

我们在局部变量中看下:

    function add2(){
        var num2 = 1; //局部变量无法实现累加
        alert(num2++)
    }
    add2();
//1由于在局部变量中每次调用都会初始化num2=1,所以就无法实现累加,这种情况下,我们就得使用闭包
    add2();//1
    add2();//1

通过闭包的方式:

 function add3(){
        var num3 = 1;
        return function (){
            num3++;
            alert(num3)
        }
    }
//这种方式并不会实现累加,因为每次调用一次函数,函数都会从上到下执行一次,num都会初始化一次
   // add3();//1 
   // add3();//1
   // add3();//1

来看看另一种闭包的调用方式

 var fun =add3();
//函数只在赋值的时候初始化一次,接着后面在调用的时候执行的是里面的匿名函数,所以这种方法是可行的。
    fun();//2
    fun();//3
    fun();//4

闭包的优缺点:
优点:可以将局部变量驻留在内存中,可以避免全局变量。
全局变量会在复杂的程序中造成许多麻烦(命名冲突,垃圾回收)
缺点:由于闭包作用域返回的局部变量资源不会被立即销毁回收,
可能会占用更多内存,过度使用闭包会导致性能下降;
所以我们最好在使用完毕之后赋值null

fun=null;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容