一、匿名函数
就是没有名字的函数
如何表示:
1、(function( ){ //封装成表达式,自我执行
alert('Lee');
})(); //()表示执行函数,并且传参
2、 赋值给变量
var box =function() {
return 'Lee';
};
alert(box());
3、函数里的匿名函数
function box(){
returnfunction(){ //函数里的匿名函数,产生闭包
return 'Lee';
}
}
alert(box()()); //调用匿名函数
模仿块级作用域:
因为在JavaScript中没有块级作用域的概念,出了if(){} for(){}范围,
变量不会被销毁,就算重新声明同一个变量也不会改变他的值,所以用
匿名函数来构造一个块级作用域,使得里面的变量能够出了范围后自动销毁。
优点:
减少闭包占用的内存问题
(function(){
//这里是块级作用域
})();
举例:
function box(count){
(function(){
for(var i=0;i<count;i++){}
})();
alert(i); //报错,无法访问
}
box(2);
二、闭包
是指有权访问另一个函数作用域中的变量的函数。
创建闭包:
在一个函数内部创建另一个函数,通过另一个函数访问这个函数的局部变量
function box(){
var user='Lee';
returnfunction(){ //通过匿名函数返回box()局部变量
return user;
};
}
alert(box()()); //通过box()()来直接调用匿名函数返回值
var b=box();
alert(b()); //另一种调用匿名函数返回值
优点:
也就是他的缺点,就是可以把局部变量驻留在内存中,可以避免使用全局变量。
比如:
通过闭包可以实现局部变量的累加:
function box(){
var age=100;
return function(){
age++;
return age;
}
}
var b=box(); //获得函数
alert(b()); //调用匿名函数
alert(b()); //第二次调用匿名函数,实现累加
闭包里作用域返回的局部变量资源不会被立刻销毁收回,所以可能会占用更多的内存,过度使用闭包会导致性能下降,建议在非常有必要的时候才使用闭包