问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

js中闭包是什么意思,有什么作用,最好举例说明啊。

发布网友 发布时间:2022-04-24 06:35

我来回答

2个回答

热心网友 时间:2022-04-07 10:57

函数对象可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数作用域内,这种特性在计算机科学文献中称之为“闭包”。
从技术角度讲,所有的JavaScript函数都是闭包: 它们都是对象,它们都关联到作用域链。
实现计数器
介绍利用闭包实现计数器,请看以下代码:

var counter = (function() {

var count = 0;

return function() {

return count ++;

}

})();

以上代码定义了一个立即执行的函数,count遍历只能在这个匿名函数中可以使用。

热心网友 时间:2022-04-07 12:15

最简单地说:内调外

概括:闭包就是函数内调用外面的变量


例一:[1]

请看以下代码

    function add(a,b)

    {

        return a+b;

    }

    add(5,8);

结果:13

接下来,请分析这段代码,和第一段代码有什么不同:

    function makeadd(a)

        return function(b){

            return a+b;

        }

    }

    var add=makeadd(5);

    add(8);

结果:13

在加粗的代码中,a 并不存在于该函数作用域,而是调用了外面的 a 。这里的 a 就是闭包(closure)


例二:[2]

一个计数器的困境

假设您想使用变量来计数,并且您希望此计数器可用于所有函数。
您可以使用全局变量和函数来递增计数器:
    // 初始化计数器
var counter = 0;
// 递增计数器的函数
function add() {
counter += 1;
}
// 调用三次 add()
add();
add();
add();
// 此时计数器应该是 3

上述解决方案有一个问题:页面上的任何代码都可以更改计数器,而无需调用 add()。
对于 add() 函数,计数器应该是局部的,以防止其他代码更改它:
    // 初始化计数器
var counter = 0;
// 递增计数器的函数
function add() {
var counter = 0;
counter += 1;
}
// 调用三次 add()
add();
add();
add();
//此时计数器应该是 3。但它是 0。

它没有用,因为我们显示全局计数器而不是本地计数器。
通过让函数返回它,我们可以删除全局计数器并访问本地计数器:
    // 递增计数器的函数
function add() {
var counter = 0;
counter += 1;
return counter;
}
// 调用三次 add()
add();
add();
add();
//此时计数器应该是 3。但它是 1。

它没有用,因为我们每次调用函数时都会重置本地计数器。
JavaScript 内部函数可以解决这个问题。

JavaScript 嵌套函数

所有函数都有权访问全局作用域。
事实上,在 JavaScript 中,所有函数都有权访问它们“上面”的作用域。
JavaScript 支持嵌套函数。嵌套函数可以访问其上的作用域。
在本例中,内部函数 plus() 可以访问父函数中的 counter 计数器变量:
    function add() {
var counter = 0;
function plus() {counter += 1;}
plus();
return counter;
}

这样即可解决计数器困境,如果我们能够从外面访问 plus() 函数。
我们还需要找到只执行一次 counter = 0 的方法。
我们需要闭包(closure)。

JavaScript 闭包

    var add = (function () {
var counter = 0;
return function () {return counter += 1;}
})();
add();
add();
add();
// 计数器目前是 3

例子解释
变量 add 的赋值是自调用函数的返回值。
这个自调用函数只运行一次。它设置计数器为零(0),并返回函数表达式。
这样 add 成为了函数。最“精彩的”部分是它能够访问父作用域中的计数器。
这被称为 JavaScript 闭包。它使函数拥有“私有”变量成为可能。
计数器被这个匿名函数的作用域保护,并且只能使用 add 函数来修改。


总结:闭包指的是有权访问父作用域的函数,即使在父函数关闭之后。


参考资料:

[1]MDN--JavaScript闭包

[2]W3School JavaScript 闭包


声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
巴西龟最长活多久,家养!!! 养胃的药最好的是什么啊 婴儿积食发烧不愿吃药怎么办 板门穴位在哪个部位 手机设置放偷看的方法? 凝结水回收器生产厂家? 个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 录音笔可以作为法律证据吗 JAVASCRIPT中的匿名函数指的是没有名字的函数吗,有何作用啊,在代码文本... 买个录音笔有用吗? 录音笔好用吗? js闭包和PHP闭包的区别 录音的效果好吗,现在还有必要专门买录音笔么 JavaScript 闭包 智能录音笔的录音效果好吗? Javascript中的闭包是什么意思?? 录音笔究竟好不好用呢? javascript另类闭包问题 请问,录音笔有什么用? JavaScript中的闭包是用来做什么的? Js编程语言中,什么叫匿名自我调用函数? WEB前端学习五 什么是闭包 javascript 函数中的匿名函数一定是闭包吗? 如何做好计划生育宣教工作 javascript 为什么要使用匿名函数 或者说 匿名闭包 计划生育协会关于争创“五好小级”“五有小组”的几件好事实事 如何做好计划生育生育服务登记工作总结 那录音笔什么功能最有用,买的时候需要注意哪些?怎么挑选 javascript中的window.ActiveXObject和闭包是什么意思有什么作用,在... 老罗说的AI录音笔大家有用过吗?录音笔的拾音效果怎么样? 搜狗录音笔录音效果好不好? 讯飞录音笔怎样,有用过的吗? 讯飞智能录音笔录音清晰准确吗?有用过的吗? 智能录音笔学生有用的吗? 高清录音笔真的有用吗 什么牌子的录音笔录音质量最好?怎样知道录音笔效果好,有哪些指标? 微信中的照片怎样插入到美篇制作? 西葫芦是丝瓜吗 怎么把一篇很长的文章制作成吸引人看的美篇 线瓜是什么瓜? 丝瓜炒西葫芦怎么做好吃 东北民间俗称角瓜的疏菜学名叫什么? 形状像西葫芦短粗是什么瓜? 黄瓜丝瓜苦瓜冬瓜哪个最耐高温又耐涝? 西葫芦按植物学怎样分类? 急!这是丝瓜还是西葫芦!糊塌子需要放水么? 为什么说是葫芦科是瓜类大家庭?