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

希望能通俗点说。。。谢谢... 希望能通俗点说。。。谢谢 展开
 我来答
Arvin90
2016-10-23 · TA获得超过452个赞
知道小有建树答主
回答量:297
采纳率:89%
帮助的人:235万
展开全部
函数对象可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数作用域内,这种特性在计算机科学文献中称之为“闭包”。
从技术角度讲,所有的JavaScript函数都是闭包: 它们都是对象,它们都关联到作用域链。
实现计数器
介绍利用闭包实现计数器,请看以下代码:

var counter = (function() {

var count = 0;

return function() {

return count ++;

}

})();

以上代码定义了一个立即执行的函数,count遍历只能在这个匿名函数中可以使用。
素淡又朴素的柠檬2
2020-03-20
知道答主
回答量:11
采纳率:0%
帮助的人:4536
展开全部

最简单地说:内调外

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


例一:[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 闭包


已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式