首页 > 代码库 > javascript匿名函数与闭包

javascript匿名函数与闭包

匿名函数是相对于有名字的函数

如function setAge(){}函数名为setAge

而类似于function(){}则就是一个匿名函数

有名字的函数执行时可以写成setAge(),而没有名字的函数则执行要写成(function())();

另一种方式是把匿名函数赋值给一个变量来使用

var a=function(){
alert("hello,world");
}
a();

匿名函数传参

(function(age){
return age;

})(100);

匿名函数产生闭包

闭包简单来说就是一个函数里面还有函数(一般来说是匿名函数),看代码:

function box(){
var a=10;
return function(){
alert("hello")
 }
}
box()//返回function(){ alert("hello") }一串代码
box()()//再加一个()才执行了匿名函数,返回hello

关于闭包解释,上面的说明太粗俗了,下面具体说明

有权访问另一个函数作用域内变量的函数都是闭包

闭包源于js作用域链问题,在js中局部变量可以直接访问全局变量,而全局变量无法访问局部变量

function box(){
var a=10;

}

alert(a)//未定义,全局无法访问函数体内的var a=10变量,但有时我们需要外部能够取得这个局部的a变量,这时我们怎么做呢?闭包方式来了

利用js中局部变量可以直接访问全局变量,而全局变量无法访问局部变量这一原理,我们在box(){}内再构建一个函数,这事var a对于这个新构建的函数来说就是他的“全局变量”

例如

function getCircle(){
var pi=3.1415926;//局部变量,怎样要外面的alert取得pi呢
return function (){//写一个函数,这个函数可以取得pi的值
  return pi;//这个pi值一旦调用getCircle()就可以return出匿名函数里的这个pi
}
}
alert(getCircle()());

使用闭包的好处有什么?

在js中一旦function执行完毕,里面的变量都会被垃圾回收,被销毁,可以这样理解,js中局部变量优先于全局变量执行,函数体执行完毕后,就被销毁,所以全局变量就无法访问局部了。在一些情形中,我们需要将局部变量保存下来,我们就要用到闭包了。

总结:闭包好处:

一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中。 

function box(){
var a=0;
return function(){
    a=a+1;
return a;
}
}
var b=box();
b();//1
b();//2

每次执行一次b() var a都不会清零,而是保留了上次的结果!

 

javascript匿名函数与闭包