JavaScript 闭包
JavaScript 变量可以属于 当地的 或者全球的 范围。
可以使用以下方法将全局变量设为本地(私有) 闭包.
全局变量
A function
可以访问所有定义的变量里面 函数如下:
但 function
还可以访问定义的变量外部 函数如下:
在最后一个例子中, A 是全球的 多变的。
在网页中,全局变量属于该页面。
页面中的所有其他脚本都可以使用(和更改)全局变量。
在第一个例子中, A 是当地的 多变的。
局部变量只能在定义它的函数内部使用。它对其他函数和其他脚本代码是隐藏的。
同名的全局变量和局部变量是不同的变量。修改其中一个变量不会修改另一个变量。
笔记
创建的变量 没有 声明关键字(var
, let
, 或者 const
) 始终是全局的,即使它们是在函数内部创建的。
可变寿命
全局变量一直存在直到页面被丢弃,例如当您导航到另一个页面或关闭窗口时。
局部变量的生命周期很短。它们在函数调用时创建,在函数执行结束时删除。
反困境
假设您想使用一个变量来计数某些事物,并且希望所有函数都可以使用该计数器。
您可以使用全局变量和 function
增加计数器:
上述解决方案存在一个问题:页面上的任何代码都可以改变计数器,而无需调用 add()。
柜台应位于 add()
函数,以防止其他代码更改它:
例子
// 启动计数器
让计数器=0;
// 增加计数器的函数
函数添加(){
让计数器=0;
计数器+=1;
}
// 调用 add() 3 次
添加();
添加();
添加();
//计数器现在应该是 3。但它是 0
亲自尝试 »
它不起作用,因为我们显示的是全局计数器而不是本地计数器。
我们可以删除全局计数器并通过让函数返回它来访问本地计数器:
它不起作用,因为我们每次调用该函数时都会重置本地计数器。
JavaScript 内部函数可以解决这个问题。
JavaScript 嵌套函数
所有函数都可以访问全局范围。
事实上,在 JavaScript 中,所有函数都可以访问其“上方”的范围。
JavaScript 支持嵌套函数。嵌套函数可以访问其“上方”的作用域。
在此示例中,内部函数 plus()
可以访问counter
父函数中的变量:
如果我们能够达成 plus()
从外部发挥作用。
我们还需要找到一种方法来执行 counter = 0
只有一次。
我们需要一个结束。
JavaScript 闭包
还记得自调用函数吗?这个函数是做什么的?
示例解释
变量 add
被分配给自调用函数的返回值。
自调用函数仅运行一次。它将计数器设置为零 (0),并返回一个函数表达式。
这样 add 就变成了一个函数。“奇妙”的是,它可以访问父作用域中的计数器。
这称为 JavaScript 关闭。 它使得函数可以具有“私人的“变量。
计数器受匿名函数范围保护,只能使用 add 函数进行更改。
闭包是指即使父函数已经关闭,仍可以访问父作用域的函数。