甚么是JS旋量群?

分两分钟介绍搞清楚JavaScript旋量群
先看几段标识符:
function a(){ var n = 0; function couter() { n++; console.log(n); } couter(); couter(); } a(); //控制面板输入1,再输入2再上看几段标识符:
function a(){ var n = 0; this.couter = function () { n++; console.log(n); }; } var c = new a(); c.couter(); //控制面板输入1 c.couter(); //控制面板输入2甚么是旋量群?这是旋量群!简单吧。
无权出访另两个表达式促进作用皮先卡表达式的表达式都是旋量群。这儿 couter 表达式出访了构造表达式 a 里头的表达式 n,因此逐步形成了两个旋量群。 再上看几段标识符:
function a(){ var n = 0; function couter(){ n++; console.log(n); } return couter; } var c = a(); c(); //控制面板输入1 c(); //控制面板输入2看看是是不是继续执行的: var c = a(),这句 a()回到的是表达式 couter,那这句等同于 var c = couter; c(),这句等同于 couter(); 注意,表达式名只是两个标识(指向表达式的指针),而()才是继续执行表达式。 后面三句翻译过来是: var c = couter; couter(); couter();,跟第几段标识符有区别吗? 没有。
为甚么要这样写?
我们知道,js的每个也是互不影响的,这是所谓的增强“封装性”。 而之因此要用 return 回到表达式标识 couter,是因为在 a 表达式外部无法直接调用 couter 表达式,因此 return couter 与外部联系起来,在标识符 2 中的 this 也是将 couter 与外部联系起来而已。
常见的陷阱
function createFunctions(){ var result = new Array(); for (var i=0; i < 10; i++){ result[i] = function(){ return i; }; } return result; } var funcs = createFunctions(); for (var i=0; i < funcs.length; i++){ console.log(funcs[i]()); }乍一看,以为输入 0~9 ,万万没想到输入10个10?
这儿的陷阱是:表达式带()才是继续执行表达式! 单纯的句 var f = fnction() { alert(Hi); }; 是不会弹窗的,后面接句 f(); 才会继续执行表达式内部的标识符。上面标识符翻译一下是:
var result = new Array(), i; result[0] = function(){ return i; }; //没继续执行表达式,表达式内部不变,不能将表达式内的i替换! result[1] = function(){ return i; }; //没继续执行表达式,表达式内部不变,不能将表达式内的i替换! … result[9] = function(){ return i; }; //没继续执行表达式,表达式内部不变,不能将表达式内的i替换! i = 10; funcs = result; result = null; console.log(i); // funcs[0]()就是继续执行 return i 语句,是回到10 console.log(i); // funcs[1]()是继续执行 return i 语句,是回到10 … console.log(i); // funcs[9]()是继续执行 return i 语句,是回到10为甚么只垃圾回收了 result,但却不收了 i 呢? 因为 i 还在被 function 引用着啊。好比两个餐厅,盘子总是有限的,因此服务员会去巡台回收空盘子,但还装着菜的盘子他是不是敢收? 当然,你自己手动倒掉了盘子里头的菜(=null),那盘子就会被收走了,这是所谓的内存回收机制。 至于 i 的值是不是还能保留,其实从文章开头一路读下来,这应该没有甚么可以纠结的地方。盘子里头的菜,吃了一块不就应该少一块吗?
总结一下
旋量群是两个表达式引用另外两个表达式的表达式,因为表达式被引用着因此不会被回收,因此可以用来封装两个私有表达式。这是优点也是缺点,不必要的旋量群只会徒增内存消耗!另外使用旋量群也要注意表达式的值是否符合你的要求,因为他就像两个静态私有表达式一样。旋量群通常会跟很多东西混搭起来,接触多了才能加深理解,这儿只是开个头说说基础性的东西。