JavaScript闭包

JavaScript闭包闭包内部函数拥有比它的外部函数更长的生命周期!!!函数可以访问它被创建时所处的上下文环境!!!内部函数能访问外部函数的实际变量,而无需复制!实例:/**点击li标签时,调用其onclick事件,执行代码段function(){alert(i);}*此时,i在全局中的值为4*/window.onload=init;functioninit(){ var

大家好,又见面了,我是你们的朋友全栈君。

闭包

内部函数拥有比它的外部函数更长的生命周期!!!
函数可以访问它被创建时所处的上下文环境!!!
内部函数能访问外部函数的实际变量,而无需复制!
实例:

/*
 * 点击li标签时,调用其onclick事件,执行代码段function(){alert(i);}
 * 此时,i在全局中的值为4
 */
window.onload = init;
function init(){
	var lis = document.getElementById("wrap").getElementsByTagName("li");
	var i;
	for(i=0;i<lis.length;i++){
		lis[i].onclick = function(){
			alert(i);	// 结果:点击每个li都弹出4
		};
	}
}

/*
 * 执行onclick过程,调用(2)处函数,并不是调用(1)处函数;
 * 而(1)也存活,存活域中不存在变量i
 */
window.onload = init;
function init(){
	var lis = document.getElementById("wrap").getElementsByTagName("li");
	var i;
	for(i=0;i<lis.length;i++){
		lis[i].onclick = function(i){ //(1)
			return function(){ //(2)
				alert(i);
			};	// 结果:undefined
		}();
	}
}

/*
 * 执行onclick过程,调用(2)处函数,并不是调用(1)处函数;
 * 而(1)也存活,存活域中不存在变量i;
 * 变量i在循环时暂存储到了匿名函数中
 */
window.onload = init;
function init(){
	var lis = document.getElementById("wrap").getElementsByTagName("li");
	var i;
	for(i=0;i<lis.length;i++){
		lis[i].onclick = (function(i){	//(1)
			return function(){	//(2)
				alert(i);
			};	// 结果:正确
		})(i);
	}
}

/*
 * 页面加载时,在for循环中,为每个li标签绑定onclick事件;
 * 执行函数liclick(),依次弹出0,1,2,3
 */
window.onload = init;
var liclick = function(index){
	alert(index);
}
function init(){
	var lis = document.getElementById("wrap").getElementsByTagName("li");
	var i;
	for(i=0;i<lis.length;i++){
		lis[i].onclick = liclick(i); // 结果:加载页面时自动弹出0,1,2,3
	}
}

/*
 * 页面加载时,在for循环中,为每个li标签绑定onclick事件;
 * 执行函数liclick(),该函数返回值为一个匿名函数,i暂存到匿名函数中,不会立即执行;
 * 用户点击li标签时,触发匿名函数
 */
window.onload = init;
var liclick = function(index){
	return function(){
		alert(index);
	}
}
function init(){
	var lis = document.getElementById("wrap").getElementsByTagName("li");
	var i;
	for(i=0;i<lis.length;i++){
		lis[i].onclick = liclick(i); // 结果:正确
	}
}




常用解决方案:

(1)给对应的li添加一个属性记录是第几个如 id=0,1,2,3

(2)将函数外移,避免函数套函数


版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/148007.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 【图像超分辨】RDN

    【图像超分辨】RDNRDN网络结构实现细节讨论(与其他网络的区别)实验设置实验结果参考博客RDN——ResidualDenseNetwork——残差深度网络。RDN是基于深度学习的超分方法之一,发表于CVPR2018。网络结构RDN网络结构分为4个部分:SFENet(ShallowFeatureExtractionNet,浅层特征提取网络);RDBs(ResidualDenseBl…

    2022年6月18日
    54
  • opkg[通俗易懂]

    opkg[通俗易懂]opkg是个安装器,小巧,功能全。root@hbg:/#opkgfilesopkgPackageopkg(9c97d5ecd795709c8584e972bfdf3aee3a5b846d-7)isinstalledonrootandhasthefollowingfiles:/bin/opkg–命令存放地/etc/opkg.conf…

    2022年4月28日
    80
  • copy.deepcopy()_python列表copy函数

    copy.deepcopy()_python列表copy函数python中对于对象的拷贝分为浅拷贝(copy)和深拷贝(deepcopy)两种方式。其中浅拷贝由“=”完成。而深拷贝由copy模块中deepcopy()函数担任。浅拷贝和深拷贝的区别是:浅拷贝只是将原对象在内存中引用地址拷贝过来了。让新的对象指向这个地址。而深拷贝是将这个对象的所有内容遍历拷贝过来了,相当于跟原来没关系了,所以如果你这时候修改原来对象的值跟他没关系了,不会随…

    2022年9月28日
    4
  • 旅游管理系统项目java设计_基于JSP的旅游管理系统设计与实现(MyEclipse,SQL)

    旅游管理系统项目java设计_基于JSP的旅游管理系统设计与实现(MyEclipse,SQL)基于的旅游管理系统设计与实现(MyEclipse,SQL)(任务书,外文翻译,毕业论文12000字,程序代码,SQL2012数据库,答辩PPT)摘要随着科技的迅速发展,计算机技术已应用到社会的各个领域。随着计算机技术和通信技术的迅速发展,网络的规模也逐渐增大,网络的元素也随之不断增加,有的利用其通信,有的利用其商业用途,在网络上进行出售、收购、宣传等操作,从而使得网络越来越成为现今社会上必不可…

    2022年6月4日
    37
  • smartctl命令详解_smartmontools

    smartctl命令详解_smartmontools安装smartctlubuntu系统安装方法。root@gucloud:~#aptinstallsmartmontoolsReadingpackagelists…DoneBuildingdependencytreeReadingstateinformation…DoneSuggestedpackages:gsmartcontrolsmart-notifiermailx|mailutilsThefollowingNEWp

    2022年10月8日
    3
  • 毫无头绪的自学Python,你可能连门槛都摸不到![通俗易懂]

    毫无头绪的自学Python,你可能连门槛都摸不到![通俗易懂]目前的IT行业发展日趋迅猛,IT产业的产值成倍增长,不少人都打算从零基础开始学习python。对于零基础的初学者来说,最迷茫的是不知道怎样开始学习?那这里小编为大家规划了一条零基础自学必看pyth

    2022年7月3日
    25

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号