匿名函数和闭包

顾名思义,匿名函数就是没有名字的函数,闭包是可以访问一个函数作用域里变量的函数,其实就是一个函数里面的函数就叫闭包。

下面使用直接编程来说明,创建两个文件,一个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:由于闭包中作用域返回的局部变量不会被立刻销毁,所以可能会占用过多的内存,过度的使用闭包会导致性能的下降