美文网首页
(转)js闭包初入门

(转)js闭包初入门

作者: 秃头成就技术 | 来源:发表于2018-09-15 08:44 被阅读9次

先看一段JS代码:function a(){ 

           var num = 0;

            function b(){                num++;                console.log(num);            }  

          return b;       

 }         

var add = a();       

 add();      // 1        

add();      // 2        

add();      // 3

这段代码的特点:·函数a里面定义了一个函数b,函数b里面的操作让变量num自加的,最后一句是return b,将函数b返回了;

·add变量是指向了函数a的(有点像C的指针),函数a里面的函数b是被外部变量add引用了,函数b就形成了一个闭包了。

 那闭包一般用来干嘛呢?

·在JavaScript模拟实现块级作用域,封装私有变量,防止污染全局变量举个栗子🌰

var foo = (function(){ 

       var secret = "secret"; 

       return {           

 //特权方法           

 get_secret : function () {               

 return secret;         

   },   

         set_secret :function(new_secret){   

             secret = new_secret;           

 }    

    }   

 })();


alert(secret)  //undefined   

 alert(foo.get_secret());    //secret    

  alert(foo.get_secret());    //x

    JS是没有类似Java的class、private关键字来封装一个私有变量的,在JS是使用闭包机制去模拟实现的,首先在匿名函数里声明一个secret变量值也为'secret',在函数的外部呢是无法访问到的。在匿名函数里return的是setter和getter方法,foo对象指向的是匿名函数,这样就能在外部去访问一个局部变量了,但是要通过setter和getter的方法,它们也叫做特权方法

    再或者呢,不设置setter的方法,只有个getter的方法,老大跟我说这样就用在游戏里能防作弊了0.0 

    闭包的弊端:  javascript是高级语言,拥有自动的垃圾回收机制,所需内存的分配以及无用内存的回收完全实现了自动管理。简单来说就是找出那些不再继续使用的变量,然后释放其占用的内存。

垃圾收集方式主要有:1、标记清除;2、引用计数; 

 常见的方式就是标记清除了,垃圾收集器会给所有贮存在内存的变量加上标记,然后它会去掉环境中的变量以及被环境中被其他变量引用的变量的标记,剩下还有标记的变量就被视为准备删除垃圾了,因为它们不会再被环境所使用到,最后,垃圾收集器完成内存清除工作。 

 到 2008 年为止,IE、Firefox、Opera、Chrome 和 Safari 的 JavaScript 实现使用的都是标记清除式的 垃圾收集策略(或类似的策略),只不过垃圾收集的时间间隔互有不同。 

 正如上面说到的,闭包是在一个函数里面函数,但是被外部的变量所引用到了,所以它是会永远贮存在内存里而不会被销毁,造成了内存泄露,所以对于闭包还是要谨慎使用

相关文章

  • (转)js闭包初入门

    先看一段JS代码:functiona(){ varnum = 0; functionb(){num++;conso...

  • JS闭包入门

    最近有看到朋友的面经里提到的JS闭包的问题,就想研究研究,以下是我对JS闭包的简单理解。 到底什么是JS闭包? 定...

  • php之闭包函数(Closure)

    php闭包函数(Closure) JS闭包 js和php闭包使用和区别

  • JS闭包

    JS闭包 闭包练习

  • JS闭包问题(二)

    在之前的JS闭包问题(一)文章中大概介绍了一下JS闭包,同时讲了闭包与变量之间的问题,今天我们继续聊闭包,聊聊闭包...

  • web前端学习:深入理解JS闭包

    第一部分:初遇闭包 http://www.runoob.com/js/js-function-closures.h...

  • JS闭包大结局(JS闭包系列3)

    在上一篇中再谈JS闭包(JS闭包系列2),我详细的介绍了JS中的变量作用域相关的概念,结合第一节关于JS闭包(JS...

  • 学习JavaScript闭包和作用域笔记

    JS JavaScript闭包和作用域 闭包 JavaScript高级程序设计中对闭包的定义:闭包是指有权访问另外...

  • js闭包--基础篇(入门)

    闭包:简单来说就是将内容封闭起来,外界无法访问. 闭包技术: 作用域规则:内层的作用域可以访问外层的作用域,但是反...

  • 再谈JS闭包(JS闭包系列2)

    这篇文章,来继续谈谈Javascript闭包的剩余问题。因为在上一篇文章中关于JS闭包(JS闭包系列1)主要简单的...

网友评论

      本文标题:(转)js闭包初入门

      本文链接:https://www.haomeiwen.com/subject/kklpgftx.html