前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JavaScript闭包

JavaScript闭包

作者头像
奋飛
发布2019-08-15 16:14:52
7160
发布2019-08-15 16:14:52
举报
文章被收录于专栏:Super 前端Super 前端

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

本文链接:https://ligang.blog.csdn.net/article/details/44702115

闭包

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

代码语言:javascript
复制
/*
 * 点击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
		};
	}
}
代码语言:javascript
复制
/*
 * 执行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
		}();
	}
}
代码语言:javascript
复制
/*
 * 执行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);
	}
}
代码语言:javascript
复制
/*
 * 页面加载时,在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
	}
}
代码语言:javascript
复制
/*
 * 页面加载时,在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)将函数外移,避免函数套函数

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015年03月28日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 闭包
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档