匿名函数:创建函数时,不指定函数名的函数。此种函数只能运行一次,可以避免变量全局污染,保护变量。
匿名函数可以回调使用,比如 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变量的一个副本,因此就可以返回各自的不同的值
总结:匿名函数都和闭包除了都是函数,并没有共同点。