仍记得刚来到公司的时候,老大跟咱们提及原型链、闭包、MV*之类的东西,当时真的是一脸懵逼的样子啊哈哈javascript
在公司作前端开发也差很少四个月了,每一天感受都是很忙碌,都是忙着写业务代码或者本身在学习新东西,总感受不少知识点在这样的状态下,匆匆忙忙就略过了,本身并无真正理解掌握下来,仍是要趁有时间仍是把那些东西捡回来前端
先看一段JS代码:java
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就造成了一个闭包了。学习
那闭包通常用来干吗呢?spa
·在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 foo.set_secret("x"); alert(foo.get_secret()); //x
JS是没有相似Java的class、private关键字来封装一个私有变量的,在JS是使用闭包机制去模拟实现的,首先在匿名函数里声明一个secret变量值也为'secret',在函数的外部呢是没法访问到的。在匿名函数里return的是setter和getter方法,foo对象指向的是匿名函数,这样就能在外部去访问一个局部变量了,可是要经过setter和getter的方法,它们也叫作特权方法blog
再或者呢,不设置setter的方法,只有个getter的方法,老大跟我说这样就用在游戏里能防做弊了0.0
闭包的弊端:
javascript是高级语言,拥有自动的垃圾回收机制,所需内存的分配以及无用内存的回收彻底实现了自动管理。简单来讲就是找出那些再也不继续使用的变量,而后释放其占用的内存。
垃圾收集方式主要有:一、标记清除;二、引用计数;
常见的方式就是标记清除了,垃圾收集器会给全部贮存在内存的变量加上标记,而后它会去掉环境中的变量以及被环境中被其余变量引用的变量的标记,剩下还有标记的变量就被视为准备删除垃圾了,由于它们不会再被环境所使用到,最后,垃圾收集器完成内存清除工做。
到 2008 年为止,IE、Firefox、Opera、Chrome 和 Safari 的 JavaScript 实现使用的都是标记清除式的 垃圾收集策略(或相似的策略),只不过垃圾收集的时间间隔互有不一样。
正如上面说到的,闭包是在一个函数里面函数,可是被外部的变量所引用到了,因此它是会永远贮存在内存里而不会被销毁,形成了内存泄露,因此对于闭包仍是要谨慎使用
以上,是对于闭包机制的一些我的理解,若是文中出现错误,欢迎你们指正:)