HTML Dog
跳至导航

闭包

闭包是一个返回函数的函数。被返回的函数(内部函数)是在被调用的函数(外部函数)内部创建的,因此——由于我们已经看到的作用域规则——内部函数可以访问外部函数的变量和参数。

闭包是一个强大的工具,但可能很难理解。然而,掌握它们将使您能够编写一些非常优雅的代码。

这是一个例子


var saver = function (value) {
    return function () {
        return value;
    };
};

var retriever = saver(10);

alert(retriever());

10

saver 函数返回一个函数,该函数在被调用时会检索传递给 saver 的值。内部函数之所以能够做到这一点,是因为它是在外部函数的范围内创建的,并且在特定范围内创建的函数即使在范围之外被调用,也能保留对该范围内变量的访问权。

使用闭包的一种方法是创建根据传递给外部函数的参数而表现不同的函数。例如,这是一个add 函数。传递给外部函数的参数用于加到传递给内部函数的参数上。


var add = function (a) {
    return function (b) {
        return a + b;
    };
};

var addFive = add(5);

alert(addFive(10));

15

这里的addFive 中保存的内部函数,在被调用时可以访问a,因为它是在与a 相同的范围内创建的。内部函数将ab相加并返回结果。

在上面的示例中,内部函数被保存为addFive,因为它将 5 加到传递给它的任何值上。以同样的方式,可以使用字符串创建一个不同的加法函数


var hello = add('Hello ');

alert(hello('tom'));

Hello tom