闭包

1,闭包的例子:

function outer(){
	var x=30;
	return x;
}
console.log(outer());-----30
---------------------------------
function outer1(){
	var x=30;
	return function () {
		return x;
	};
}
var foo=outer1();
console.log(foo());-------30
这里允许outer1的内部匿名函数调用外部函数的局部变量x,这就是闭包。

闭包,即是允许函数内部的函数调用外部的局部变量,参数。(形成闭包的函数必须要已经调用过一次,而不只是声明一次)
如:function outer1(){
var x=30;
var a={};
a.fo=function () {
return x;
};
window.a=a;
}
[outer1();]必须加上这个中括号内的内容,把函数调用一次之后才能形成闭包。
console.log(a.fo());----在没有outer1();的情况下会报错;反正30

2,闭包-封装
var expert ={};
window.expert=expert;----------window下挂着的全局变量,这样就把内部的export对象暴露出去,在function的外部也可以调用了

(function (){
	var _userId=123;
	var _typeId="item";
	function converter(userId){
		return userId;
	}
	expert.getUserId=function(){
		return converter(_userId);
	};
	expert.getTypeId=function (){
		return converter(_typeId);
	};
}());
 console.log(expert._typeId);---undefined
 console.log(expert._userId);---undefined
 console.log(expert.getTypeId());---item
 console.log(expert.getUserId());---123

这里exper的typeId与userId无法直接被访问到,因为他被封装了,只能通过闭包访问到。

闭包常见错误—循环闭包

document.body.innerHTML="<div id=div1>aaa</div>"+"<div id=div2>bbb</div><div id=div3>ccc</div><div id=div4>ddd</div>";
for (var i = 1; i<4; i++) {
	document.getElementById('div'+i).addEventListener('click',function(){
		console.log(i);
	}
	}

相当于点击的时候这个for循环已经处理完了,每次点击的时候都是i=4,甚至可以在外部获取到i的值为4,因为这里的i是个全局变量。
改进方法:使用闭包函数

for (var i = 1; i<4; i++) {
	!function(i){document.getElementById('div'+i).addEventListener('click',function(){
		console.log(i);
	});}(i);
}

相当于function(i)就储存了遍历时的i值,内部函数的点击函数就调用外部函数的参数i,这就是典型的闭包。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值