也谈JavaScript的闭包

U盘重装Win10系统 准备工作 准备一个8G或8G以上U盘(32G以内) 请备份好u盘里的资料,在制作过程中会格式化硬盘 请备份好要安装系统的盘的资料,安装时也会对该盘内容进行格式化。 将u盘插入电脑usb接口中,尽可能的插入usb3.0的接口,这样下载和安装速度会更快。 1.到微软官网下载安装包 浏览器输入:微软官网下载win10 懒人请复制粘贴:https://www.microsoft.com/zh-cn/software-download/windows10 ​ 打开之后的界面: 2.下载Media Creat. 阅读详情

JavaScript的闭包是在面试的时候常见的一个问题,其实在实际的工作中,你可能使用到了闭包,但是没有意识到期间就是闭包。

这里,我通过一个小例子来说明闭包的使用。


Q1:下面的这段html ,每行鼠标移动上后变为灰色


<div>
			<ul id="list">
				<li>第一个</li>
				<li>第二个</li>
				<li>第三个</li>
				<li>第四个</li>
			</ul>
		</div>

这个是不是小case嘛:

<script type="text/javascript">
        // JavaScript 闭包应用
        var list_obj = document.getElementById("list").getElementsByTagName("li"); //获取list下面的所有li的对象数组    
        for (var i = 0; i < list_obj.length; i++) {    
            list_obj[i].onmousemove = function() {    
                this.style.backgroundColor = "#cdcdcd";    
            }    
            list_obj[i].onmouseout = function() {    
                this.style.backgroundColor = "#FFFFFF";    
            }   
        }  
      
    </script>

不要着急,

Q2: 点击每列,显示相应的索引值:

如果你想当然的像下面这样写:

list_obj[i].onclick = function() {    
				alert("这是第" + i + "记录");  
			}

非常遗憾的告诉你,每次输出结果都一样,输出3。

这是为什么呢?


让我们看看上面那段代码,

其实这里for循环已将整个列表循环了一遍,并执行了i++,所以这里i变成了3,

那么有什么好的办法解决这个问题吗? 那就是“闭包”了


看看什么是闭包


闭包时是指内层的函数可以引用存在与包围他的函数内的变量,即使外层的函数的执行已经终止。


解决办法:

方法一:

list_obj[i].onclick = (function(i){ 
				return function(){
					alert(i+1);
				} 
			})(i); 

方法二:

var list_obj = document.getElementById("list").getElementsByTagName("li"); //获取list下面的所有li的对象数组    
		for (var i = 0; i < list_obj.length; i++) {    
			list_obj[i].onmousemove = function() {    
				this.style.backgroundColor = "#cdcdcd";    
			}    
			list_obj[i].onmouseout = function() {    
				this.style.backgroundColor = "#FFFFFF";    
			}   
			
			/*list_obj[i].onclick = function() {    
				alert("这是第" + i + "记录");  
			}*/	
			
			var col = new bind_li(i);    
			list_obj[i].onclick = col.clickFunc; 
		}  

		function bind_li(i) {    
			this.clickFunc = function() {    
				alert("这是第" + (i + 1) + "记录");    
			}
		}

方法三:

var li = document.getElementsByTagName('li');
		for(var i=0,l=li.length;i<l;i++){
			(function (o,i){
				o.onclick = function (){
					alert(i);
				}
			})(li[i],i)
		}; 

这里,推荐阮一峰的 学习Javascript闭包(Closure)


图自编码器(GAE)与变分图自编码器(VGAE) 在学习图自编码器之前先了解一下自编码器与变分自编码器。 阅读详情

相关推荐

手把手教你学Simulink--控制执行场景实例:基于Simulink的智能车辆自动紧急制动(AEB)仿真

本文完成了基于 Simulink 的智能车辆自动紧急制动(AEB),实现了:✅ 构建前车急刹与静止障碍物典型场景✅ 设计基于 TTC 的三级 AEB 决策逻辑✅ 验证在高风险场景下有效避免碰撞✅ 掌握从风险评估到制动执行的完整安全链✅ 为ADAS 主动安全功能开发奠定基础。

MHD0815的博客 203

DOM-操作元素

操作元素 排他思想(算法) 让一组按钮都绑定点击事件 在一组相同的标签中,想让某一个元素实现某种样式,需要用到循环的排他算法: 所有元素全部清除样式(干掉所有人) 给当前元素添加样式(留下自己) 注意顺序不能颠倒,首先干掉所有人,再设置自己 <body> <button>按钮1</button> <button>按钮2</button> <button>按钮3</button> &

weixin_41909678的博客 603

RockChip Android14 修改LCD背光最大值

在调试LCD屏时时长会出现硬件不匹配,导致电流过大,屏幕发热严重。在不调整硬件的情况下,我们可以通过修改软件,降低LCD背光最大值来实现适配。我们都知道LCD屏背光是靠pwm来控制,一般来说最大值可以设置为255,针对上述问题,我们可以通过软件来降低该值,比如200,100等等。

qq_34968572的博客 613

JS-DOM

指的是由W3C制定的属性通用属性 所有标签都有的属性 id , class ,style,title,src;特有属性 只有一个或者几个标签有的属性 name, type, checked ,value,disabled;

hello world 400

样式属性操作

element.style 行内样式操作 修改的样式比较少或者想达到的功能简单的情况下,我们应该使用 元素.style 的方式来进行修改 element.className 类名样式操作 适合于样式较多或者功能比较复杂的情况下使用 element.classList.toggle('类名')切换类采用element.classList.toggle('类名')(支持ie10以上的版本),切换类就是没有就添加,有就移除。

m0_72313625的博客 1621

23 - JavaScript 通过style对象设置行内样式

style属性的获取和修改 在DOM当中,如果想设置样式,有两种形式: className(针对内嵌样式) style(针对行内样式) 这篇文章,我们就来讲一下style。 需要注意的是:style是一个对象,只能获取行内样式,不能获取内嵌的样式和外链的样式。例如: <!DOCTYPE html> <html lang="en"> <head> ...

JayYuen的博客 1万+

鼠标经过、移出改变表格颜色

 通过onMouseOver(鼠标经过)、onMouseOut(鼠标移去)事件来控件当前行的样式,即this.style.backgroundColor来实现表格行的颜色改变。对于C# web控件,如DataGrid,可通过其特性Attributes来实现。控件名.Attributes.Add("onMouseOver","this.style.backgroundColor=#FFCC

faunjoe的专栏 698

Java闭包具体应用_[Java教程]再JavaScript闭包及应用

[Java教程]再JavaScript闭包及应用0 2016-10-10 00:00:05 写在前面

weixin_30783947的博客 93

JavaScript闭包

之前有整理过一版关于闭包的概念,但感觉思路不是很清晰,是临时想起一些例子来讲的,今天再次来讲一下闭包闭包: 函数嵌套函数,内部函数可以引用外部函数的参数和变量 function aaa(a){ var b=5; function bbb(){ alert(a); alert(b); } } ...

dengpi2643的博客 115

JS的闭包

今天偶然接触到js的闭包概念,看了几篇关于JS 闭包的介绍,从迷糊到明白,差点就把我绕进去。 function subf(){ var n = 0; function finc(){ n++; console.log(n); } return finc; } var c = subf(); c(); //输出1 c(); //输出2 看各路大神讲什么是闭包,用法等等… 其实: 1、js 是支持面向对象,很多元素包括变量都作为对象处理(必须理解面向对象) 2、这里s.

Ti-蜗牛的博客 176

JavaScript-再闭包

之前写过一篇浅闭包的博客(https://blog.csdn.net/weixin_41309331/article/details/102649282)但当时并没有从原理性的入口来讲起闭包。这几天复习《JavaScript高级程序设计》(第三版)时,整理了一些原理性的知识。 实际上,要讲闭包,得先理解JavaScript中作用域链的概念,作用域链也是理解全局不能引用局部变量,局部可以引用全局...

weixin_41309331的博客 188

Js闭包

不知不觉距离上一篇闭包文章已经过了8个月了,现在的理解对比之前要健壮的多,再次总结下花生理解的闭包闭包实际上就是子作用域读取父作用域的变量,这本来很合理也很简单,但是关键点在于这个读取是动态的,请看下面的例子: for(var i=0 ;i<3 ;i++){ setTimeout(function(){ ...

weixin_34071713的博客 89

JavaScript的closure--JavaScript 闭包

关于JavaScript闭包,在我的博客上之前有一篇文章https://www.cnblogs.com/wphl-27/p/8491327.html 今天看了几篇文章,感觉又有了一些更深的理解,特记录如下: 其实关于JavaScript闭包closure, 简单点理解可以如下: 在JavaScript中,一个函数A内部又包含一个函数B, 同时把内部函数B作为函数A的返回值,这个时...

weixin_30553065的博客 111

javascript闭包

闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现。   一、变量的作用域   要理解闭包,首先必须理解Javascript特殊的变量作用域。   变量的作用域无非就是两种:全局变量和局部变量。   Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。   Js代码     var n=999; ...

javaSamBlog 106

JavaScript闭包及应用

写在前面 本文章版权归博客园和作者共同所有,转载请注明原文地址博客园吴双 http://www.cnblogs.com/tdws/ 闭包真的是学过一遍又一遍,Js博大精深,每次学习都感觉有新的收获。相信在大家封装前端插件时,闭包是必不可少的。闭包的真正好处我个人认为除了封装还是封装,能带个我们私有方法,和调用上的灵活方便,也会使你的代码对外的对象保持干净整洁。 进入正题 维基百科这样定...

weixin_34415923的博客 81

单击后变化背景颜色 js JS中style属性

<span onClick='this.style.backgroundColor="#FFF";' contenteditable="true" style="background-color:#0F0">Item 1</span> 复制代码 解决办法: 1、先定义一个CSS规则,然后this.className=’’ 2、document.getElementByI...

wwppp987的博客 1966

js:Uncaught TypeError TypeError: Cannot read properties of undefined (reading ‘style‘)

这个错误通常是由于尝试访问未定义或null的对象的属性而引起的。在这种情况下,您尝试读取一个名为’style’的属性,但该属性的所有者是未定义的。给div元素添加了一个点击事件的监听器。当div元素被点击时,会执行函数内的代码。将其宽度设置为200像素,高度设置为50像素。检查对象是否存在,以避免访问未定义或null的对象。设置div元素的宽度和高度为100像素。将被点击的div元素的背景颜色设置为绿色,通过。确保对象具有所需的属性,例如’style’。将div元素的背景颜色设置为红色。

weixin_56871552的博客 1270

关于background和backgroundColor

let allli = document.getElementById("lowqUL").getElementsByTagName("li"); for (var i = 0; i < allli.length; i++) { allli[i].style.backgroundColor = ""; } for (var i = 0; i < this.lowArray.leng...

szh1127249432的博客 924

设置属性的案例练习

设置盒子的大小和透明度 css部分 body{ background-color: #000; } .box { height: 100px; width: 100px; background-color: pink; } body部分 <div class="box"></div> <script> var box = document.getE...

qq_42309685的博客 194

C#winform 运动控制卡 上位机软件(六轴运动控制卡)

C#winform 运动控制卡 上位机软件(六轴运动控制卡)详细情况请看我的文章介绍 https://blog.csdn.net/m0_65636467/article/details/132557158C#winform 运动控制卡 上位机软件(六轴运动控制卡)详细情况请看我的文章介绍https://blog.csdn.net/m0_65636467/article/details/132557158

1929-2024年全球气象站点年平均降水数据(Excel-Shp)-最新出炉.zip

1929-2024年全球气象站点年平均降水数据(Excel_Shp)-最新出炉.zip数据概览该数据下载各气象站点1929-2024的逐日平均降水数据,并将其除以年份天数得出的站点年平均气温数据,其中无效值用9999.99表示,2024年的数据到7月20日。如果需要中国范围的站点可以在站点名称里进行筛选,中国的缩写为CH。其中PRCP_1929_1955等三个表格为日降水数据,因其数据量过大将其分别放在三个表格之中,year_PRCP_1929_2024为年平均降水数据。时间跨度:1929-2024年数据格式:Excel/Shp

上一篇: mysql中int、bigint、smallint 和 tinyint的区别与长度的含义
下一篇: [JavaScript]兼容IE6/7的getElementByClassName
spring21st
博客等级 码龄21年 449粉丝 407原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值