javascript中的闭包

      在程序语言中,所谓闭包,是指语法域位于某个特定的区域,具有持续参照(读写)位于该区域内自身范围之外的执行域上的非持久型变量值能力的段落。这些外部执行域的非持久型变量神奇地保留他们在闭包最初定义(或创建)时的值。

作用域链
var a = 1 ;
function text(){
   var b = 2 ;
   return a ;
}
console.log(text());
console.log(b);

可以看出b无法在外部被打印出来,而在函数外部定义的a则被打印出来



a = 1 ;
function text(){
	var b = 2 ;
	function text1(){
		var c = 3 ;
		console.log("text1函数打印的a:"+a);
		console.log("text1函数打印的b:"+b);
		console.log("text1函数打印的c:"+c);
		return c;
	}
	text1();
}
text();

 

可以看出,text可以使用所有的变量,这就形成了一个作用域链的效果

text1可以访问自己的,父级的,全局得到,一层一层往上走。


词法作用域
function f1(){
	var a = 1 ;
	return f2();
}
function f2(){	
	return a;
}
console.log(f1());

只能访问自身的作用域和全局里面内容,这两个函数是不共享的


通过闭包突破全局作用域链
function f1(){
	var a = 'qwe' ;
	return function(){
		return a ;
	};
}
var text = f1();
console.log(text()); 

结果成果的访问到了a,这种方法将a的值提升到了全局区域,通过访问text就可以访问a的值

也可以在定义一个全局变量,在函数里面赋值后在外部调用

var n;
function f1(){
	var a = 'qwe' ;
	n = function(){
		return a ;
	};
}
f1();
console.log(n());

得到的结果是一样的


 优点:不产生全局变量,实现属性私有化。

缺点:闭包中的数据会常驻内存,在不用的时候要删掉否则会导致内存溢出





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值