javascript ECMAScript-闭包

来源:互联网 发布:golang 2.0 编辑:程序博客网 时间:2024/05/21 05:41

 前面总结的很简单。需要有一定javascript的语法基础。如果有不对的地方,还请指正。吐舌头

闭包

首先,我们先来聊一聊作用域 ,作用域,是一种环境,变量所处的环境,一个function(){} 会创建一个作用域,

<pre name="code" class="javascript">var a = 10;function test(){var a = 20;return a;}var b = test(a);alert(a);//10
alert(b);//20

上面的栗子中,全局变量 a  和 函数内变量 a 是两个不同的变量,输出的是两个不同的值

var a = 10;function test(){<span style="white-space:pre"></span> a = 20;return a;}var b = test(a);alert(a);//20
<pre name="code" class="javascript">alert(b);//20

这个栗子却输出了20,前面说过,没有var关键字,会被赋值到window对象上,所以他们相当于两次赋值 ,那么问题来了,函数内的作用域是一个环境,怎么能用全局环境的值呢?

这里就要说一说延长作用域链,当一个变量在当前环境内没有找到声明时,会沿着作用域链访问活动对象,这是栗子中,window对象,就是test函数t的活动对象,变量a没有在函数内声明,他会访问活动对象,如果没有找到。返回undefined。

到了这里,我们就要说一说今天的猪脚。闭包。函数有自己的作用域,这个作用域,通过外部是访问不到的。栗子

var a = 10;function test(){var b = 20;}alert(a);//10 
alert(b);//error
函数执行到alert(b)的时候。报错了,因为找不到变量b,作用域可以向上查找,但是不能反方向查找,这一点要牢记。

那么,我们如何访问变量b呢 :栗子

var a = 10;function test(){ var b = 20; return b;}alert(a);//// alert(b);这里我们注释了alert(test());
没错,就是return ,函数返回了变量b,当然,如果你alert(b),还是会报错,只不过,我们换了一个思路,调用函数,返回他的值。我们不需要变量名,而是他的值。

这就是闭包的一个简单的例子。 来个复杂的栗子

function test(){ var b = {num:20}; return { getNum:function(){ return b.num; }, setNum:function(num){ b.num = num; }, }}alert(test().getNum());//20test().setNum(30);alert(test().getNum());//30
如果我们声明了一个对象,我不想别人直接操作他,而是给他两个方法,一个获得,一个设置。这样。我的对象就被保护起来。保证结构不被破坏,就像DOM和BOM提供的API一样。只是给了你一个调用的方法。这是一个闭包很好的作用。闭包,就说到这里,还有一些要点,被许多的大牛提到过,不再累述。如果有不对的地方,还请指正。



0 0
原创粉丝点击