JavaScript 闭包

发布于 2024-08-19 12:57:24 字数 2142 浏览 16 评论 0

闭包可以定义为 JavaScript 功能,其中内部函数可以访问外部函数变量。在 JavaScript 中,每次创建闭包时都会创建一个函数。

该闭包具有三个作用域链,列出如下:

  • 进入自己的范围。
  • 访问外部函数的变量。
  • 访问全局变量。

让我们通过一个例子来了解闭包。

例 1


function fun()
{
var a = 4; // 'a' is the local variable, created by the fun()
function innerfun() // the innerfun() is the inner function, or a closure
{
return a;
}
return innerfun;
}
var output = fun();
document.write(output());
document.write(" ");
document.write(output());

输出量

4 4

在上面的程序中,我们有两个函数:fun() 和 innerfun()。函数 fun() 创建局部变量 a 和函数 innerfun()。内部函数 innerfun() 仅存在于 fun() 的主体中。内部函数可以访问外部函数的变量,因此函数 innerfun() 可以访问变量’a’,该变量在 fun() 中声明和定义。

这是作用中的闭包,内部函数可以访问全局变量和外部函数变量。

由于语句 return innerfun,函数 innerfun() 的整个主体将返回并存储在变量输出中。内部函数不能仅通过使用 return 语句来执行;仅在大括号() 之后才执行。

在输出中,代码将显示在父函数定义的变量’a’的值。

现在,还有另一个示例,我们将使用参数化函数

例 2


function fun(a)
{
function innerfun(b){
return a*b;
}
return innerfun;
}
var output = fun(4);
document.write(output(4));
document.write(" ");
document.write(output(5));

输出量

16 20

在上面的程序中,有两个参数化的函数:fun() 和 innerfun()。函数 fun() 的参数为 a,函数 innerfun() 的参数为 b。函数 fun() 返回一个函数 innerfun(),该函数接受一个参数并返回 a 和 b 的乘法。在程序中,输出为闭包。

现在,还有另一个在循环中关闭的示例。

例子 3


function fun()
{
function closure(val)
{
return function()
{
return val;
}
}
var a = [];
var i; 
for (i = 0; i < 5; i++)
{
a[i] = closure(i); 
}
return a;
}
var output = fun();
document.write(output[0]());
document.write(" ");
document.write(output[1]());
document.write(" ");
document.write(output[2]());
document.write(" ");
document.write(output[3]());
document.write(" ");
document.write(output[4]());

输出量

0 1 2 3 4

闭包指向变量并存储变量的引用。他们不记得变量的值。在上面的代码中,我们将在每次调用时更新函数 closure() 参数。因此,我们将在不同的索引处获得变量 i 的不同值。

闭包是 JavaScript 概念中较难理解的概念之一,但是请尝试在不同的场景中实践闭包,例如创建回调,getters / setter。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

月野兔

暂无简介

0 文章
0 评论
23 人气
更多

推荐作者

謌踐踏愛綪

文章 0 评论 0

开始看清了

文章 0 评论 0

高速公鹿

文章 0 评论 0

alipaysp_PLnULTzf66

文章 0 评论 0

热情消退

文章 0 评论 0

白色月光

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文