zoukankan      html  css  js  c++  java
  • 匿名函数与闭包

    匿名函数:创建函数时,不指定函数名的函数。此种函数只能运行一次,可以避免变量全局污染,保护变量。

    匿名函数可以回调使用,比如 btn.addEventListener("click",function(){...})

    也可以用匿名函数声明函数名,比如var abc=function (){console.log(222)}

    这种方法定义的函数和function abc(){console.log(222)}有什么区别呢?

    abc()   //报错   变量提升但是函数没有
    var abc=function(){
        console.log(222)
    }
    abc()  //2222  函数声明放在任意位置都可以被调用;
    function abc(){
      console.log(2222)  
    }

    匿名函数也可以自己调用自己执行,有两种方式可以实现方式

    +function(...){...}(...)

    (function(...){...})(...)

    闭包:一个可以使用另外一个函数(外函数)作用域中的变量的函数(内函数)。

    原理就是外部函数作用域(AO)在作用域链下不被释放可以被重用。

    释放AO的先后顺序为先释放内函数AO,再释放外函数AO。

    闭包有3个特点:1.有内外两个函数2.要有return值3.要有受保护的变量

    在javaScript高级教程设计书中这么介绍闭包的缺点

    function createFunction(){
        var result=new Array;
        for(var i=0;i<10;i++){
            result[i]=function(){
        return i;
    }
    }
    return result;
    }

    表面上看每个函数似乎应该返回自己的索引值,但实际上每个函数返回10。因为每个函数的作用域链中都保存者createFunction()函数的活动对象,所以他们引用的都是同一个变量i。当createFunction()函数返回后,变量i的值是10;

    function createFunction(){
        var result=new Array;
        for(var i=0;i<10;i++){
            result[i]=function(num){
        return function(){
        return num;
    };
    }(i);
    }
    return result;
    }

    在这个版本中,我们没有直接把闭包赋值给数组,而是定义了一个匿名函数,并将立即该匿名函数的结果赋给数组。这里的匿名函数有一个参数num,也就是最终的函数要返回的值。在调用每个匿名函数时,我们传入变量i。又创建并返回了一个访问num的闭包。这样一来,result数组中的每个函数都有自己num变量的一个副本,因此就可以返回各自的不同的值

    总结:匿名函数都和闭包除了都是函数,并没有共同点。

  • 相关阅读:
    zabbix入门知识
    flask_login
    flask_数据库
    flask_web表单
    flask_模板
    flask_hello world
    1024 Hello World
    使用bat批处理文件备份postgresql数据库
    使用bat批处理文件备份mysql数据库
    在windows7下创建ftp服务站点
  • 原文地址:https://www.cnblogs.com/tzzf/p/8099051.html
Copyright © 2011-2022 走看看