资讯专栏INFORMATION COLUMN

通俗地理解javascript闭包

lingdududu / 1007人阅读

摘要:每个家庭就好比一个闭包函数不同的家庭有不同的老婆老公孩子,他们的名字甚至也可以是一样的,然后每个家庭是独立的。

定义

闭包是一个拥有许多变量和绑定了这些变量的环境的表达式(通常是一个函数),因而这些变量也是该表达式的一部分。。(百度百科)

通俗的说:JavaScript中所有的function都是一个闭包

案例解读

基本案例

function foo() {
    var i = 0;
    return function() {
        return ++i;
    }
}

var bar=foo();

这里的foo运行后返回了一个函数,这个函数拥有一个自己私有的变量i,这个变量i不会因为foo运行结束了就被销毁。
返回的这个函数被赋值给bar,这个bar就是一个闭包,它的特征是拥有自己的私有成员,该例子中私有成员是变量i,这个私有成员可以是一个函数

带有循环的闭包

function foo() {
    var result = [];
    for (var i = 0; i < 10; i++) {
        result[i] = function(){return i};
    }

return result;
}

var bar = foo();

现象如上,原因是循环生成了10个闭包,但是,他们的私有成员i是他们共有的,当最后一个闭包函数生成后,i的值已经等于10,而前面的闭包的i都是这个i

循环生成闭包并且拥有真正的自己i

function foo() {
    var result = [];
    for (var i = 0; i < 10; i++) {
        result[i] = (function(i) {
            return function() {
                return i
            }
        })(i);仔细对比这里的区别
    }

    return result;
}

var bar = foo();

显然,循环生成的每个闭包都真正拥有的自己私有变量,解决办法是代码中的自执行函数包裹需要生成的闭包函数,并为闭包函数提供一个独立的变量,这个时候它们的i是来自包裹它们的自执行函数的参数,而不是刚才的foo里面的那个i,所以它们各是各的

总结

闭包的用途在我看来是为函数提供私有的变量,使得数据安全,不会污染别人的变量,别人的成员,别人的老婆。

每个家庭就好比一个闭包函数,不同的家庭有不同的老婆、老公、孩子,他们的名字甚至也可以是一样的,然后每个家庭是独立的。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/78384.html

相关文章

  • 一个考查作用域以及闭包的题目

    摘要:怎么理解这句话呢也就是说一个函数离开了创建时的作用域,但是其还是会和这个作用域以及这个函数外部的作用域相关联,也就是说变量依旧是那个变量以这个题目为参照,那么结果就很明了了。 var a = 2;var func = (function(){ var a = 3; return function(){ a++; console.log(a); } })(); func(...

    sushi 评论0 收藏0
  • JavaScript 中的闭包

    摘要:简要介绍闭包可谓是中的一大特色了,即使你对闭包没概念,你可能已经在不知不觉中使用到了闭包。这就是闭包的独特之处。当页面中存在过多的闭包,或者闭包的嵌套很多很深时,会导致内存占用过多。因此,在这里建议慎用闭包。 1. 简要介绍 闭包可谓是js中的一大特色了,即使你对闭包没概念,你可能已经在不知不觉中使用到了闭包。闭包是什么,闭包就是一个函数可以访问到另一个函数的变量。这就是闭包,解释起...

    liuhh 评论0 收藏0
  • 还是不明白JavaScript - 执行环境、作用域、作用域链、闭包吗?

    摘要:所以,全局执行环境的变量对象始终都是作用域链中的最后一个对象。讲到这里,可能你已经对执行环境执行环境对象变量对象作用域作用域链的理解已经他们之间的关系有了一个较清晰的认识。 JavaScript中的执行环境、作用域、作用域链、闭包一直是一个非常有意思的话题,很多博主和大神都分享过相关的文章。这些知识点不仅比较抽象,不易理解,更重要的是与这些知识点相关的问题在面试中高频出现。之前我也看过...

    jlanglang 评论0 收藏0
  • 《你不知道的javascript》笔记_作用域与闭包

    摘要:建筑的顶层代表全局作用域。实际的块级作用域远不止如此块级作用域函数作用域早期盛行的立即执行函数就是为了形成块级作用域,不污染全局。这便是闭包的特点吧经典面试题下面的代码输出内容答案个如何处理能够输出闭包方式方式下一篇你不知道的笔记 下一篇:《你不知道的javascript》笔记_this 写在前面 这一系列的笔记是在《javascript高级程序设计》读书笔记系列的升华版本,旨在将零碎...

    galaxy_robot 评论0 收藏0
  • 深入理解闭包的概念

    摘要:离开闭包的泥淖,给这个例子一个较为合理的写法总结理解闭包的概念是重要的,但我们不应当过多的使用闭包,它有优点,也优缺点,是一把双刃剑。 闭包 关于闭包,目前有如下说法: 闭包是函数和声明该函数的词法环境的组合(MDN) 函数对象可以通过作用域链相互关联起来,函数体内部的变量都可以保存在函数作用域内。这种特性在计算机科学文献中被称为闭包(JavaScript权威指南) 闭包,指的是词...

    anyway 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<