责任编辑面向全国新手,天神轻喷。
旋量群是甚么?算数javascript的人,单厢碰触到两个小东西叫作旋量群,听出来觉得很矮小上的。网路上也有各式各样各式各样的说明,只不过我总的来说,没必要性用太现代科学的道德观来审视旋量群。
事实上,你每晚都在用旋量群,而已你不晓得而已。
比如说:
var cheese = 乳酪; var test = function(){ alert(cheese); }OK,你早已写了两个旋量群。
表达式也是两个正则表达式表达式 cheese 是在自上而下返回值中的两个表达式,当你建立了两个 test 表达式,所以,test 和 cheese 就共享资源两个自上而下返回值。
你要附加晓得的一点儿是,在js中,表达式和表达式其本质上是两个小东西。表达式也是两个正则表达式。
从下面的表述中也能看出这一点儿。你就算不坚信不然,他们上看呵呵咯。
alert(cheese); alert(test);让他们再上看一看 test 和 cheese各是甚么类别:
alert(typeof test);看到了吧,而已类别不同而已,他们都是正则表达式。
唯一的不同点就是,表达式类别的 test 可以拥有自己内部逻辑,而string类别的 cheese 只能存放两个字面值,这就是区别,仅此而已。
一目了然了,唯一不同的就是普通表达式是字面值一样的存在,而表达式需要打个括号才能执行而已。
你看,我现在打两个括号:
test();打了括号,才会执行表达式里面的逻辑。
返回值让他们回到旋量群,现在将之前的代码做两个小小的变动:
var cheese = 乳酪; var test = function(){ alert(cheese); } function test2(){ var cheese = null; test(); } test2();所以,你觉得现在 alert 出的是 null 还是乳酪呢?
思考呵呵。。。
对的,弹出的还是乳酪。
之前已经说过了,表达式 test 和 表达式 cheese 同处于一片蓝天下 — 同两个返回值。
表达式 test 和 表达式 cheese 共同享有的返回值叫作自上而下返回值,就好像地球一样,他们所有的人都享有这个地球,能够在这里呼吸,吃饭,玩耍。
对test而言,他能访问到的返回值只有它本身的旋量群和自上而下返回值:
也就是说,正常情况下他访问不到其他旋量群里的内容,在 test2 里面表述的表达式跟它没有半毛钱关系,所以弹出的 cheese 依旧是自上而下返回值里的 cheese。
表达式可以创造自己的返回值。
他们刚才表述了两个 test 表达式,{ } 包裹出来的部分就形成了两个新的返回值,也就是所谓的旋量群。
只不过你深刻了解了返回值的原理后,旋量群也就理解了。
就好比地球是两个自上而下返回值,你自己家的房子是两个表达式,你的房子是私人空间,就是两个局部返回值,也就是你自己建了两个旋量群!
你透过窗户可以看见外边的景色,比如说院子里的一棵芭蕉树,你于是通过眼镜观察看到了芭蕉树的颜色,高度,枝干的粗细等等。
这一棵芭蕉树相当于两个自上而下表达式,你在自己的旋量群内可以访问到它的数据。
所以,在这个例子中,test 就是两个房子,在里面可以通过窗户访问到自上而下返回值中的乳酪 —— 表达式 cheese。
也就是说,cheese 在被 test 访问到的时候,就进入了它的旋量群。
这样说明,你是否觉得好理解一点儿呢?
现在你是否可以理解一开始我说,旋量群这小东西只不过我们天天都在用的意思了呢?
他们给出旋量群的第两个注解:
1. 旋量群就是在表达式被建立的时候,存在的两个私有返回值,并且能够访问所有的父级返回值。
回到刚才的例子:
var cheese = 乳酪; var test = function(){ alert(cheese); } function test2(){ var cheese = null; test(); }在这个例子中,test 和 test2 各自享有两个返回值,对不对?而且他们互相不能访问。比如说,我在 test 中表述的两个表达式,test2就无法直接访问。
var test = function(){ var i = 10; } function test2(){ alert(i); } test2();像这样,一旦执行 test2 表达式,编译就不通过,因为在 test2的旋量群内,根本找不到表达式 i 。它首先会在自己的旋量群内寻找 i,找不到不然就去父级返回值里找,这边的父级就是自上而下返回值,很遗憾,还是没有。这就是所谓的返回值链,它会一级一级往上找。如果找到最顶层,还是找不到不然,就会报错了。
在这里,还有两个需要注意的点就是:如果某两个旋量群中对自上而下返回值(或父级返回值)中的表达式进行了修改,所以任何引用该表达式的旋量群单厢受到牵连。
这的确是两个需要注意的地方。
举个例子
var cheese = 乳酪; var test = function(){ cheese = 乳酪被偷吃了! } function test2(){ alert(cheese); } test(); test2();结果是:
很有趣,是不是呢?
当他们在表述两个表达式,就产生了两个旋量群,如果这个表达式里面又有若干的内部表达式,就是旋量群嵌套着旋量群。
像这样:
function house(){ var footBall = 足球; /* 客厅 */ function livingRoom(){ var table = 餐桌; var sofa = 沙发; alert(footBall); } /* 卧室 */ function bedRoom(){ var bed = 大床; } livingRoom(); } house();表达式house是两个旋量群,里面又表述了两个表达式,分别是livingRoom客厅,和bedRoom卧室,它们各自形成两个自己的旋量群。对它们而言,父级返回值就是house。
如果他们希望在客厅里踢足球,在livingRoom表达式执行的时候,它会先在自己的旋量群中找足球,如果没找到,就去house里面找。一层一层往上找,直至找到了为止。当然,这个例子可能不是很恰当。但起码展示了返回值,闭包之间的联系。
再说明呵呵, 旋量群就是在表达式被建立的时候,存在的两个私有返回值,并且能够访问所有的父级返回值。因此,从理论上讲,任何表达式都是两个旋量群!