闭包是 JavaScript 开发的一个关键方面:匿名函数可以访问父级作用域的变量。

如果闭包的作用域中保存着一个 HTML 元素,则该元素无法被销毁。(下面代码来自高程)

刚看到一个关于闭包自己没注意到的地方,

function assgin() {
var ele = document.getElementById('someEle');
ele.onclick = function(){
alert(ele.id);
}
}

以上代码创建了一个作为 ele 元素事件处理程序的闭包,而这个闭包有创建了一个循环的引用,由于匿名函数保存了一个 assgin() 的活动对象的引用 ,因此无法减少对 ele 的引用次数 , 只要匿名函数存在,ele的引用次数至少是 1。我们可以稍微改写一下:

function assgin() {
var ele = document.getElementById('someEle');
var id = ele.id
ele.onclick = function(){
alert(id);
}
ele = null;
}

上面代码中,通过把 ele.id 的一个副本保存在一个变量中,并且在比保重引用该变量消除了循环引用,但是这样还不能解决内存泄露,闭包会引用包含函数的整个活动对象,而其中包含着 ele ,即使闭包不直接引用 ele ,包含函数的活动对象中也会保存 一个引用,因此需要把 ele 变量设置为 null ,这样就解除了对 DOM 对象的引用,减少其引用数,确保能正常回收。

翻看之前关于闭包的文章,确实学习不足   深入理解JS闭包(https://www.cnblogs.com/7qin/p/9740799.html)

摘自:https://segmentfault.com/a/1190000010477169

关于js闭包之小问题大错误的更多相关文章

  1. js闭包小实验

    js闭包小实验 一.总结 一句话总结: 闭包中引用闭包外的变量会使他们常驻内存 function foo() { var i=0; return function () { console.log(i ...

  2. js闭包的作用

    js闭包的用途详解 js闭包可以用在许多地方.它的最大用处有两个,一个是前面提到的可以读取函数内部的变量,另一个就是让这些变量的值始终保持在内存中.具体怎么理解呢,各位看官请仔细看好下文   我们来看 ...

  3. MPVUE - 使用vue.js开发微信小程序

    MPVUE - 使用vue.js开发微信小程序 什么是mpvue? mpvue 是美团点评前端团队开源的一款使用 Vue.js 开发微信小程序的前端框架.框架提供了完整的 Vue.js 开发体验,开发 ...

  4. javascript深入理解js闭包(转)

    javascript深入理解js闭包 转载  2010-07-03   作者:    我要评论 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. ...

  5. 干货分享:让你分分钟学会 JS 闭包

    闭包,是 Javascript 比较重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,很难从定义去理解它.因此,本文不会对闭包的概念进行大篇幅描述 ...

  6. js闭包的作用域以及闭包案列的介绍:

    转载▼ 标签: it   js闭包的作用域以及闭包案列的介绍:   首先我们根据前面的介绍来分析js闭包有什么作用,他会给我们编程带来什么好处? 闭包是为了更方便我们在处理js函数的时候会遇到以下的几 ...

  7. [小细节,大BUG]记录一些小问题引起的大BUG(长期更新....)

    [小细节,大BUG] 6.问题描述:当从Plist文件加载数据,放入到tableView中展示时,有时有数据,有时又没有数据.这是为什么呢?相信很多大牛都想到了:我们一般将加载的数据,转换成模型,放入 ...

  8. js闭包理解实例小结

    Js闭包 闭包前要了解的知识  1. 函数作用域 (1).Js语言特殊之处在于函数内部可以直接读取全局变量 <script type="text/javascript"> ...

  9. 让你分分钟学会 JS 闭包

    闭包,是 javascript 中重要的一个概念,对于初学者来讲,闭包是一个特别抽象的概念,特别是ECMA规范给的定义,如果没有实战经验,你很难从定义去理解它.因此,本文不会对闭包的概念进行大篇幅描述 ...

随机推荐

  1. Navicat工具的使用 1

    Navicat 在生产环境中操作MySQL数据库还是推荐使用命令行工具mysql,但在我们自己开发测试时,可以使用可视化工具Navicat,以图形界面的形式操作MySQL数据库 官网下载:https: ...

  2. jquery的widget源代码剖析

    dialog_obj(别名): Widget_obj(别名): 调用widget方法 $.widget("ui.dialog",dialog_obj); // jquery.ui. ...

  3. C++中的内存区域及其性能特征

    首先须要指出的是.我们通经常使用"堆"和"自由存储"这两个术语来区分两种不同类型的动态分配内存. 1.常量数据:常量数据区域主要用于存储字符串以及其它在编译期就 ...

  4. 尾递归与Continuation(转载)

    递归与尾递归 关于递归操作,相信大家都已经不陌生.简单地说,一个函数直接或间接地调用自身,是为直接或间接递归.例如,我们可以使用递归来计算一个单向链表的长度: public class Node { ...

  5. (转)Thread中yield方法

    先上一段代码 public class YieldExcemple { public static void main(String[] args) { Thread threada = new Th ...

  6. iText实现导出pdf文件java代码实现例子

    ///////////////////////////////////主类////////////////////////////////////////// package com.iText; i ...

  7. APP网络优化篇

    Android Addresses are cached for 600 seconds (10 minutes) by default. Failed lookups are cached for ...

  8. 20165321实验一 Java开发环境的熟悉

    一.idea调试: 二.实验内容: 实现学生成绩管理功能(增删改,排序,查找),并进行测试(正常情况,异常情况,边界情况). 运行截图: 代码: public class Student { Stri ...

  9. windows go dll 框架

    乘着还没有添加商业功能之前,先给大家把福利分享了 希望有需要的朋友能够用的上 这个框架是在用windows平台,GO做的http/https服务,调用dll现有的库接口实现特定功能的大框架 //dll ...

  10. vue中清除定时器

    1.data中定义 timer:90,timeName:null 点击支付则倒计时按钮出来 pay(){ this.timeName= setInterval(()=>{ this.timer- ...