最新的Web开发教程
 

JavaScript Closures


JavaScript变数可以属于本地全局范围。

私有变量可以成为可能带密封盖


全局变量

一个函数可以访问函数定义的所有变量,就像这样:

function myFunction() {
    var a = 4;
    return a * a;
}
试一试»

但功能还可以访问函数外部定义的变量,就像这样:

var a = 4;
function myFunction() {
    return a * a;
}
试一试»

在最后一个例子, 一个全局变量。

在网页中,全局变量属于窗口对象。

全局变量可以在页面中使用(变更)所有脚本(和窗口)。

在第一个例子中, 一个是一个局部变量。

本地变量只能定义它的函数内部使用。 它是由其他功能和其他脚本代码隐藏。

具有相同名称的全局和局部变量是不同的变量。 修饰一个,不修改其他。

关键字var创建的变量,始终是全球性的,即使他们是一个函数内部创建的。


可变生命

只要全局变量住您的应用程序(你的窗口/网页)生活。

局部变量有短暂的一生。 在调用功能时它们被创建,并且当函数结束删除。


A计数器困境

假设你想使用一个变量计数的东西,并且希望此计数器可用于所有的功能。

你可以使用全局变量和函数来增加计数器:

var counter = 0;

function add() {
    counter += 1;
}

add();
add();
add();

// the counter is now equal to 3
试一试»

计数器应仅由改变add()函数。

问题是,页面上的任何脚本可以改变计数器,不调用add()

如果我宣布在函数内部计数器,任何人都无法改变它不调用Add()方法:

function add() {
    var counter = 0;
    counter += 1;
}

add();
add();
add();

// the counter should now be 3, but it does not work !
试一试»

它不起作用! 我每次调用add()函数,计数器设置为1。

一个JavaScript内部函数可以解决这个问题。


JavaScript的嵌套函数

所有功能都可以访问全局范围。

事实上,在JavaScript中,所有功能可使用“上方”它们的范围。

JavaScript的支持嵌套函数。 嵌套函数可以访问“上面”他们的范围。

在本实施例中,内功能plus()有权访问在父功能计数器变量:

function add() {
    var counter = 0;
    function plus() {counter += 1;}
    plus();   
    return counter;
}
试一试»

这可能已经解决了这个计数器的困境,如果我们可以达到plus()从外部的功能。

我们还需要找到一种方法来执行计数器= 0只有一次。

我们需要关闭。


JavaScript的闭包

记住自我调用的功能呢? 这是什么功能呢?

var add = (function () {
    var counter = 0;
    return function () {return counter += 1;}
})();

add();
add();
add();

// the counter is now 3
试一试»

例子解释:

添加变量被分配了一个自调用函数的返回值。

自调用函数只运行一次。 它将计数器设置为零(0),并返回一个函数表达式。

这种方式加载成为一个功能。 “妙”的是,它可以在父范围内访问计数器。

这被称为一个JavaScript 闭合,这使得有可能为一个函数具有“ 私有 ”的变量。

计数器是由匿名功能的范围的保护,并且只能使用添加功能来改变。

闭包是父范围有功能的访问,家长功能关闭后。