匿名函数和闭包
顾名思义,匿名函数就是没有名字的函数,闭包是可以访问一个函数作用域里变量的函数,其实就是一个函数里面的函数就叫闭包。
下面使用直接编程来说明,创建两个文件,一个html文件,一个链接到html文件中的js文件
html内容
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>匿名函数与闭包</title> <script type="text/javascript" src="js.js"></script> </head> <body> </body> </html>
js.js内容
//普通函数 function box() { return 'qintao'; } alert(box());
当使用普通函数时,浏览器会正常弹窗(好像有点废话)
单独的匿名函数如
//单独的匿名函数 function () { return 'qintao'; }
是无法运行的,要想使用匿名函数,有几种方法,
方法一:匿名函数赋值给变量,如下
var box = function () { return 'qintao'; };//这里有分号 alert(box);//这里是alert(box)
因为你是把函数赋值给一个变量这是一条赋值语句,所以在最后最好加上;这个时候如果你只是打印box,他打印出来的一个函数如下图,
如果你想打印的是名字(即函数返回值),alert(box)就得改成alert(box())
方法二:通过自我执行来执行匿名函数
这个的语法就是 (匿名函数)();第一个圆括号放匿名函数,第二个圆括号表示执行如:
(function () { alert("qintao"); })();
自我执行函数的传参是在后面那个括号实现的如下
//自我执行函数的传参 (function (age) { alert(age); })(100);
函数里放一个匿名函数就是闭包,闭包是有权访问函数作用域变量的函数
//函数里放一个匿名函数即闭包 function box() { return function () { //闭包 return 'qintao'; } } alert(box);//打印整个函数 alert(box());//因为最外面的函数已经调用了,打印的是闭包函数 alert(box()());//最外面的函数和闭包都已经调用,打印出姓名
三个alert函数分别打印出下面内容
闭包完整的定义:闭包指有权访问另一个函数作用域中的变量的函数,创建闭包的常见方式,就是在一个函数内部创建一个函数 ,通过一个函数访问这个函数的局部变量
function box() { var age = 100; return function () { return age; }; } alert(box()());
上面的代码就是通过闭包访问age这个局部变量,事实上你也可以直接在函数中return出变量,但是使用闭包有一个特点,它可以把局部变量驻留在内存中,从而避免使用全局变量。(因为全局变量污染会导致应用程序的不可预测性,推荐使用私有变量)
为了更加了解闭包的这个特性我们通过下面一个例子来理解一下
//使用全局变量 var age = 100; function box() { age++; } box(); box(); alert(age);//输出102
在这里age作为全局变量,两次运行box函数,age会实现累加变成102
//使用局部变量 function box() { var age = 100; age++; return age; } box(); box(); alert(box());//输出101
在这里两次运行box函数,每次运行age又都会被初始化,所以输出的是101
//使用闭包 function box() { var age = 100; return function () { //闭包函数 age++; return age; }; } var b = box(); b(); alert(b());//输出102,调用两次
这里需要把box()赋值给一个量,是因为我们只要调用后面的闭包函数,不需要执行整个函数,如果执行整个函数age又会被初始化成100;
ps:由于闭包中作用域返回的局部变量不会被立刻销毁,所以可能会占用过多的内存,过度的使用闭包会导致性能的下降