深入分析Javascript的闭包机制

Javascript变量可以是局部变量,也可以是全局变量。

私有变量可以用于闭包。

全局变量

函数可以作为具有函数内部定义的变量访问,例如:

例子




函数myFunction(){
var a=4;
返回一个;
}




函数还可以访问由函数外部定义的变量,例如:

例子




var a=4;
函数myFunction(){
返回一个;
}


在下一个实例中,a是一个全局变量。

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

全局变量可以应用于页面上的所有脚本。

首先,A是一个局部变量。

局部变量只能用来定义函数的内部,它不适用于其他函数或脚本代码。

全局变量和局部变量也是两个不同的变量,即使名字相同,修改其中的一个也不会影响另一个变量的值。



变量声明是,如果它不使用var关键字,那么它就是一个全局变量,即使它是在函数中定义的。

变量的生命周期

全局变量的范围是全局的,也就是说,在整个Javascript程序中,全局变量无处不在。

函数中声明的变量只在函数中起作用,这些变量是局部变量,作用域是局部的,函数的参数也是局部的,只在函数中起作用。

计数器的困境

想象一下,如果你想计算一些值,计数器在所有函数中都是可用的。

可以使用全局变量,函数设置计数器增加。

例子




var计数器= 0;

函数添加(){
计数器=1;
}

(增加);
(增加);
(增加);

计数器现在是3




当添加()函数执行时,计数器值发生变化。

但问题是页面上的任何脚本都可以改变计数器,即使它不调用Add()函数。

如果我在函数中声明一个计数器,如果没有调用函数,它将不能修改计数器的值:

例子




函数添加(){
var计数器= 0;
计数器=1;
}

(增加);
(增加);
(增加);

意图是输出 3,但输出是1!




上述代码将不能正确输出,每次调用Add()函数时,计数器将设置为1。

javascript嵌入函数可以解决这个问题。

Javascript嵌入功能

所有函数都可以访问全局变量。

事实上,在Javascript中,所有函数都可以访问上层的范围。

Javascript支持嵌套函数,嵌套函数可以访问上层的函数变量。

在这种情况下,内嵌函数加()可以访问父函数的计数器变量:

例子




函数添加(){
var计数器= 0;
函数加({计数器)=1;}
加();
返回柜台;
}



如果我们能够访问外部的加号()函数,这可以解决计数器的困境。

我们还需要确保计数器= 0执行一次。

我们需要关闭闭包。

Javascript闭包

你还记得自动呼叫的功能吗这个功能是做什么的

例子




var =(函数()){()
var计数器= 0;
返回函数(返回)计数器= 1;}
});

(增加);
(增加);
(增加);

3 计数器




案例分析

变量添加指定函数自调用的返回字值。

自动调用函数只执行一次,设置计数器为0,并返回函数表达式。

添加变量可以用作函数,其中一个很好的部分是它可以访问函数上一层函数的计数器。

这称为Javascript闭包,它使函数具有私有变量成为可能。

计数器受匿名函数的范围保护,只能通过Add方法进行修改。



闭包是一个函数,它可以访问函数最后一层的范围内的变量,即使函数的最后一层已经关闭。