匿名函数和闭包
到目前为止我们学过的函数都有一个函数名通过函数名传递相应的参数调用该函数,但是这次在JS中的接触到函数可以没有名字名字就是匿名函数。那么我们一般是如何调用匿名函数的呢
方法一:这也是函数的一种声明方式
var sum=function(x,y) {
return x+y;
}
alert(sum (2,3)); // "5"
方法二:匿名函数还能够进行自我执行
Alert((function(x,y) { return x+y;})(2,3));
匿名函数的自我执行可以解决匿名函数的一些问题,例如在循环中的匿名函数是有一定的问题的
function box(){
var arr=[];
//在循环中使用匿名函数
for(var i=0;i<5;i++){
arr[i]=function(){
return i;
};
}
return arr;
}
var b=box();
//在这里调用box()的时候,里面的循环已经执行完毕了,执行到return了,所以最后return的arr的最终结果为5
1、调用内部的匿名函数输出结果
for(var i=0;i<5;i++){
alert(b[i]());
//结果都为5个5。这里调用执行匿名函数时i已经为5,所以不会再做++了,所以结果都为5
}
这样的问题就可以通过匿名函数的自我执行解决
//通过匿名函数的自我执行
function box(){
var arr=[];
for(var i=0;i<5;i++){
arr[i]=(function(num){ //通过自我及时执行匿名函数,将每个值都保存到arr中
return num;
})(i);
}
return arr;
}
var b=box();
for(var i=0;i<5;i++){
alert(b[i]); //依次返回 1 2 3 4 5
}
在JS的函数中还学习了闭包,自己理解的就是函数中再放入一个函数就构成闭包。给出的官方的定义是:某种程序语言中的代码块允许一级函数存在并且在一级函数中所定义的自由变量能不被释放,直到一级函数被释放前,一级函数外也能应用这些未释放的自由变量。这段话结合JS视频中给出的例子
function box(){//声明box函数
var age=100; //age是在box内的局部变量
returnfunction(){ //一个匿名函数,这样就构成了闭包
age++; //对局部变量进行自加
return age;//返回结果
};
}
var b=box();//这里对age进行了初始化值为100
alert(b());//101
alert(b());//102
alert(b());//103
//实现对age累加。如果不使用闭包,每次回调用box这样每次都会初始化age,无法实现累加
box()就是一级函数其中的age是自由变量初始值为100,每次进行b()的时候是对其中匿名函数的自我执行,因为构成了闭包,所以在调用函数自我执行时其中的age是不会被释放的,从而实现累加。
小结
匿名函数和闭包在实际的应用中经常是结合到一起的,例如在循环中的匿名函数取值是存在问题的还可以使用闭包来解决JS中的很多知识都是第一次的接触到,结合视频中讲的实例和在后期博客实例的应用中自己进行的初步简单的理解,知识能够把视频中的知识点理解通,还有待深一步的理解。