闭包的讲解与简单实用(重新理解)

//闭包的概念就是函数嵌套函数  内部函数可以调用外部函数的参数和变量 并且变量贮存在内存中 不会被垃圾回收机制销毁//可以手动销毁//下面介绍闭包的介绍和简单使用 

//简单写法  function outer(){

         var num=0;

          function inner(){

           num++;
           return num;

         }       return inner;

       }

       var num=outer();
       alert(num());//1
       alert(num());//2
       alert(num());//3
       num=null;//手动销毁

//稍微复杂的写法var outer=(function(){

   var num=0;   return function(){

       num++;       return num;

   }

})();
       alert(outer());//1
       alert(outer());//2
       alert(outer());//3

   //为什么会产生闭包这种情况呢   //首先num被创建在外部函数内部 而且有内部函数对它的引用 所以当函数自执行以后   //num不会被销毁 还是会在内存中   //以上说法不能很好理解闭包这个东西   //下面这些话才可以更好的理解   //就是return 返回的不仅仅是函数 还把函数的所能访问的作用域链(从内到外一直到window)打包返回了   //所以你继续调用还可以访问的到   //总结一句话:函数的作用域取决于被定义时,而不是调用时

  /

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

//用法
1.模块化代码
2.在循环中直接找到对应元素的索引

1. var test=(function(){

function init(){alert("游戏加载成功!");}

function start(){alert("开始游戏!");}

return {

init:init,

start:start

};

})();

test.init();

test.start();

/*

这样的好处不言而喻

首先除了test以外的任何对象都访问不到 init 和start 方法

体现了高内聚的特点

维护也好

还可以改成惰性的

*/

2.<ul id="test">

<li>1</li>

<li>2</li>

<li>3</li>

<li>4</li>

</ul>

var getUL=document.getElementById("test");

var allLi=getUI.children;

var len=allLi.length;

for(var i=0;i<len;i++){

allLi[i].onclick=function(){

console.log(i);

}

}

//点击所有的都会是3

因为for循环完毕以后 allLi的点击事件还没有执行  当执行的时候 i已经变成3了

所以当你触发事件的时候 只会输出3

解决方法 :闭包


for(var i=0;i<len;i++){

(function(n){

allLi[n].onclick=function(){


console.log(n);

}

})(i);

}

//当每次for循环的时候 都会自执行匿名函数  并且把当前索引值传进去

当你触发事件的时候  会访问到你之前传进来的参数n 也就是当时for循环的索引值

//下面这种写法也可以


for(var i=0;i<len;i++){

allLi[n].onclick=(function(n){


return function(){

console.log(n);

}

})(i);

}

//同理 目的就是当每次循环的时候 把 i 保存在事件函数所能访问的最近的作用域中

就是一个当时执行i的副本  保存在作用域中 来用

 
 

原文地址:https://www.cnblogs.com/liveoutfun/p/9665435.html

时间: 2024-10-08 01:03:51

闭包的讲解与简单实用(重新理解)的相关文章

简单粗暴地理解js原型链--js面向对象编程

简单粗暴地理解js原型链--js面向对象编程 原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧,想点与代码无关的事,比如人.妖以及人妖. 1)人是人他妈生的,妖是妖他妈生的.人和妖都是对象实例,而人他妈和妖他妈就是原型.原型也是对象,叫原型对象. 2)人他妈和人他爸啪啪啪能生出一堆人宝宝.妖他妈和妖他爸啪啪啪能生出一堆妖宝宝,啪啪啪就是构造函数,俗

11--瓦片地图(一)简单实用

Cocos2DX引擎实用CCTMXTileMap类来表示瓦片地图(也就砖块地图),主要包含如下四类元素: 砖块元素:tmx文件中指定的纹理图片(理解不一定正确): 砖块拼接的图层(CCTMXLayer):这就是我们看到的背景地图,引擎以精灵CCSprite来组织砖块元素,其中包含砖块大小等诸多信息: 物体图层(CCTMXObjectGroup):可能用于组织建筑物等等 自身属性:主要是地图大小等属性. 首先需要使用Tield瓦片地图编辑器创建一个tmx格式的文件(使用教程),名称为"TileMa

闭包——抽象解释的简单注释

总是听说闭包是脚本语言中最难以理解的东西,今天我抽时间对闭包做一个解释,下面是一段百度对闭包的解释: 闭包是可以包含自由(未绑定到特定对象)变量的代码块:这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)."闭包" 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域).在 Scala.Scheme.Common Lisp.Smalltalk.

iOS边练边学--多线程介绍、NSThread的简单实用、线程安全以及线程之间的通信

一.iOS中的多线程 多线程的原理(之前多线程这块没好好学,之前对多线程的理解也是错误的,这里更正,好好学习这块) iOS中多线程的实现方案有以下几种 二.NSThread线程类的简单实用(直接上代码) 三.多线程的安全隐患 资源共享 1块资源可能会被多个线程共享,也就是多个线程可能会访问同一块资源 比如多个线程访问同一个对象.同一个变量.同一个文件 当多个线程访问同一块资源时,很容易引发数据错乱和数据安全问题(存钱取钱的例子,多个售票员卖票的例子) 安全隐患解决的方法 --- 互斥锁(图解)

Android基础入门教程——2.4.2 ListView简单实用

Android基础入门教程--2.4.2 ListView简单实用 标签(空格分隔): Android基础入门教程 本节引言: 一口气把Android入门网络编程的章节写完了,本节我们来继续学习没有讲完的UI控件部分, 回顾上一节,我们介绍了Adapter适配器的概念,然后学习了三个最简单的适配器的使用: ArrayAdapter,SimpleAdapter和SimpleCursorAdapter,而本节给大家讲解的是第一个 需搭配Adapter使用的UI控件:ListView,不过在版本中被R

滚动数组的简单实用

二维动规是如果只用到本层的和上一层的数据就可以用滚动数组 比如 dp[i,j]=max(dp[i-1,j],dp[i,j-1]); max的意思就不多说了... 具体例子的话,比较经典的就是最长公共子序列,就是 abcde 和 aecd的最长公共子序列就是acd. 如果不是滚动数组的话就是 for i:=1 to length(st1) do for j:=1 to length(st2)do if st1[i]=st2[j] then dp[i,j]:=dp[i-1,j-1]+1 else d

jQuery闭包之浅见,从面向对象角度来理解

本篇的标题虽然是"jQuery闭包之浅见...",但实际上本篇涉及的多半是javascript"闭包"相关内容,这所以写这个标题,完全是因为自己平常用jQuery写前端习惯了.还有一个原因是:javascript"闭包"很容易造成"内存泄漏", 而jQuery已经自动为我们规避.处理了由"闭包"引发的"内存泄漏". javascript的"闭包"是这样定义的:一个拥有

Android 内容提供者(ContentProvider)的简单实用

Android 中的数据库是对应用私有的,自己是无法使用别的应用的数据库的.但是往往有需求要我们使用另外一个应用或者系统应用的数据,这时候就彰显了内容提供者,ContentPrivider的作用,他就是两个应用数据的桥梁,通过内容提供者和内容接受者我们可以在不同应用间传递数据. ContentPrivider也可以视为一种数据存储.它存储数据的方式和使用它的应用程序无关,重要的是应用如何以一致的编程接口,来访问存储其中的数据.内容提供者与数据库的使用差不多,也可以增删改查.而且数据可以存储于数据

简单实用的PHP防注入类实例

这篇文章主要介绍了简单实用的PHP防注入类实例,以两个简单的防注入类为例介绍了PHP防注入的原理与技巧,对网站安全建设来说非常具有实用价值,需要的朋友可以参考下 本文实例讲述了简单实用的PHP防注入类.分享给大家供大家参考.具体如下: PHP防注入注意要过滤的信息基本是get,post,然后对于sql就是我们常用的查询,插入等等sql命令了,下面我给各位整理两个简单的例子,希望这些例子能给你网站带来安全. PHP防注入类代码如下: 复制代码 代码如下: <?php /**  * 参数处理类  *