匿名函数与闭包

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

匿名函数可以回调使用,比如 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变量的一个副本,因此就可以返回各自的不同的值

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

原文地址:https://www.cnblogs.com/tzzf/p/8099051.html