资讯专栏INFORMATION COLUMN

闭包的简单理解

EscapedDog / 663人阅读

摘要:例变量就是返回的函数,执行的时候变量并没有消失,一直驻扎在内存中的,这时会弹出的这就是简单的闭包形式。闭包的好处和应用好处希望一个变量长期驻扎在内存当中避免全局变量的污染是个全局变量,一直驻扎在内存中,依次执行会累加。

主要分三部分说:
一、什么是闭包?二、闭包有什么好处?应用在哪里?

1、什么是闭包

第一个特点:可以是函数嵌套函数

function fna(){
       function fnb(){}
   }

第二个特点:内部函数可以引用外部函数的参数和变量

function  fna(){
        var b=5;
        function fnb(){
            console.log(b);
        }
        fnb();
    }
fna();

b变量都要被内部函数fnb()引用到,会一直驻扎在内存中,不会被垃圾回收的,也就是说参数和变量不会被垃圾回收机制所收回。
那么什么是js垃圾回收机制呢?

function fna(){
        var a=1;
    }
fna();

例如,上面写了个普通函数fna(),当fna();执行完毕后变量a就不存在了,为了节省内存。
例1:

function  fna(){
        var a=5;
        function fnb(){
            console.log(a);
        }
        return fnb;
    }
var fnc=fna();
fnc();      //5

变量c就是返回的fnb函数,fnc()执行的时候 变量a并没有消失,一直驻扎在内存中的,这时会弹出5的.这就是简单的闭包形式。

2、闭包的好处和应用

好处:
1.希望一个变量长期驻扎在内存当中
2.避免全局变量的污染

var a=1;
function fna(){
    a++;
    console.log(a);
}
fna(); //2
fna(); //3
console.log(a);//3

a是个全局变量,一直驻扎在内存中,依次执行会累加。

function fna(){
     var a=1;
     a++;
     console.log(a);
}
fna(); //2
fna(); //2

如果把变量a设置为局部变量,每调用一次代码重新执行,调用后a就不存在,下次调用的时候a还是1;那么怎么能做到a即是局部变量,a又能累计呢?
这就是闭包所能做到的。
例2:

function fna(){
      var a=1;
       return function () {
          a++;
           console.log(a);
       };
}
var fnb=fna();
fnb(); //2
fnb(); //3
console.log(a) //undfined

构成了函数嵌套函数,当外面的函数执行完毕后,内部函数依旧可以调用到变量a;

(function(){
  console.log(1);
})();

()放函数,函数声明就会变成函数表达式,再加()立即执行。
至此可以把例2中的代码改写一下.

var fna= (function () {
    var a=1;
    return function () {
        a++;
        console.log(a);
    }
})();
fna();//2
fna();//3

var a=1在外面是调用不到,减少全局变量的污染,把内部函数变为私有的,

这也就是
3.变量私有

var aaa = (function(){
    var a = 1;
    function bbb(){
        a++;
        console.log(a);
    }
    function ccc(){
        a++;
        console.log(a);
    }
    return {
        b : bbb,
        c : ccc
    }
})();
//aaa.b();  //2
//aaa.c();  //3

在循环中直接找到对应元素的索引




    
    Title


  • 11111111111
  • 11111111111
  • 11111111111

console.log(i)弹出3,为什么呢?很明显,当循环执行结束的时候

aLi[i].onclick = function(){
           console.log(i);//3
      };

还没执行,当点击的时候才会执行,但此时i已经变成3了。可以利用闭包改写,可以把循环中的i当作个参数传进去,就之前所说的内部函数可以引用外部函数的参数和变量。

for(var i=0;i

把i当成参数穿进去。除了这种写法还有另外一种方式

for(var i=0;i           
               
                                           
                       
                 

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

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

相关文章

  • 多层级理解闭包

    摘要:第二梯队理解有了第一梯队的认识,我们慢慢修正大脑中对闭包的认识。理解这句话就可以很好的与闭包这两个字关联起来理解闭包这个概念了。总结第二梯队理解闭包是一个有特定功能的函数。第四梯队理解闭包通过访问外部变量,一个闭包可以维持这些变量。 闭包 闭包的概念困惑了我很久,记得当时我面试的时候最后一面有一个问题就是问题关于闭包的问题,然而到现在已经完全不记得当时的题目是啥了,但仍然能够回忆起当时...

    nemo 评论0 收藏0
  • 简单理解JavaScript中闭包

    摘要:闭包在我理解是一种比较抽象的东西。所以我写了一篇博文来方便自己理解闭包。那么现在我们可以解释一下闭包的第一个定义在计算机科学中,闭包是引用了自由变量的函数。循环中创建闭包在我们使用的关键字之前,闭包的一个常见问题就出现在循环中创建闭包。 零. 前言 从我开始接触前端时就听说过闭包,但是一直不理解闭包究竟是什么。上网看了各种博客,大家对闭包的说法不一。闭包在我理解是一种比较抽象的东西。所...

    sihai 评论0 收藏0
  • 简单而清楚地理解闭包

    摘要:大多数非闭包的情况下,函数的外部函数即全局变量函数被调用时,也会创建一条作用域链下称链,并将链的内容包含到链中,然后将当前函数的活动对象可以简单理解为所有的内部变量添加到链条的顶端。 什么是闭包?闭包是指有权访问另一个函数作用域中的变量的函数。---《JavaScript高级程序设计》通常来说,当一个函数可以访问另一个函数内部定义的变量(包括属性和方法)时,这个函数可以称之为闭包: f...

    SimonMa 评论0 收藏0
  • 通过示例学习JavaScript闭包

    摘要:译者按在上一篇博客,我们通过实现一个计数器,了解了如何使用闭包,这篇博客将提供一些代码示例,帮助大家理解闭包。然而,如果通过代码示例去理解闭包,则简单很多。不过,将闭包简单地看做局部变量,理解起来会更加简单。 - 译者按: 在上一篇博客,我们通过实现一个计数器,了解了如何使用闭包(Closure),这篇博客将提供一些代码示例,帮助大家理解闭包。 原文: JavaScript Clos...

    xingpingz 评论0 收藏0
  • 简单理解 JavaScript 闭包问题

    摘要:从我年开始接触前端,知道闭包这个词,已经过去两年了。概念闭包,在高级程序设计里面是这样介绍的闭包是指有权访问另一个作用域中的变量的函数。这样形成的闭包虽然可以使外部可以访问到内部的函数,但是导致了原有的作用域链不释放,会造成内存泄漏。 从我16年开始接触前端,知道闭包这个词,已经过去两年了。这两年里,闭包这个概念我在很多地方了解过,却实在没有真的理解,久而久之,变成了一块心病。这不,趁...

    lyning 评论0 收藏0
  • JavaScript闭包简单理解

    摘要:闭包是函数内部的子函数能读取局部变量二闭包的特点函数里面嵌套函数内部函数能访问外部函数的变量定义的参数和变量不会回收三闭包的前提先明白什么是全局变量和局部变量中声明变量格式关键字变量名标识符。建议在退出函数之前,将不使用的局部变量全部删除。 一、闭包的概念 闭包是指一个函数能够访问其函数外部作用域中的变量。JavaScript闭包是函数内部的子函数能读取局部变量 二、闭包的特点 函数...

    hzx 评论0 收藏0

发表评论

0条评论

EscapedDog

|高级讲师

TA的文章

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