JavaScript 闭包
闭包可以定义为 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 技术交流群。
上一篇: Vue 6 种组件通信方式
下一篇: Covenant 利用分析
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论