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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • PyCharm导入本地模块

    PyCharm导入本地模块1.首先进入PyCharm的设置面板2.进入后点击Porjectinterpreter,点击右上角的add3.点击Existingenvironment这个选项,然后选择interpreter4.在弹出来的窗口中选择你的python安装目录关于查找目录位置,在windows中可以打开cmd然后输入wherepythonmacos中可以打开终端输入whichp…

    2022年8月25日
    6
  • Redis缓存与数据库双写一致性

    Redis缓存与数据库双写一致性

    2021年10月5日
    33
  • ajax请求状态码是0_常见错误状态码

    ajax请求状态码是0_常见错误状态码会出现这个HTTP请求状态码400,说明这个请求是无效的,并没有进入后台服务器(控制器)里。通常的原因:前端提交的字段名称或者字段类型和后台的实体类不一样,或者前端提交的参数跟后台需要的参数个数不一致,导致无法封装。比如在SprimgMVC的控制器方法中使用了@RequestParam修饰了一个yanggb参数,但是前端在请求的时候并没有带上yanggb参数或yanggb参数为空值,就会出现这种情况;再比如前端提交到后台的数据应该是JSON字符串类型,而前端没有将对象转化为字符串类型,也会返回HTTP请

    2025年7月4日
    0
  • JAVA实现文件预览功能

    JAVA实现文件预览功能(PS前阵子发现图片没了,CSDN也没修复好,只好重新上传)近期做的项目要求实现文件在线预览功能,可支持多种文件类型,TXT,DOC,PDF,XLS,最好支持压缩包的预览功能.没办法,只能网上找啊.看了个遍,都是些不靠谱的,转来转去的一个能用的都没有,付费的产品有什么永中啊,OFFICE365啊,这些大概一搜都能搜到,价格也不是很贵但俗话说的好,能不用钱解决问题,就尽…

    2022年5月15日
    29
  • 一致性hash面试题_java面试算法

    一致性hash面试题_java面试算法为什么要用一致性hash算法?在学习一致性hash算法之前,首先要考虑下为什么要使用它,使用它能解决什么样的问题。带着问题去学习相信理解起来会更容易。大家都知道我们在使用redis分片技术,mycat对数据库进行分库分表时都会面临数据操作规则的问题;比如我们把一条记录存入redis3服务器,那么我们获取的时候如果不指定规则就会根据key在所有的redis服务器中进行遍历查找,显然这种情况是…

    2022年10月5日
    0
  • php源码审计_静态代码审计

    php源码审计_静态代码审计最近在学PHP代码审计,那就将学习的笔记都整理一遍吧~前期准备:1、安装相关软件,如Sublimetext、 Notepad++、editplus、 Seay源代码审计系统等2、获得源码,可以到网上下载各种网站源码3、安装网站审计方法:通读全文法:麻烦但全面敏感函数参数回溯法:高效常用,Seay源代码审计系统定向功能分析法:主要根据程序的业

    2022年10月2日
    0

发表回复

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

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