看了《请以你的名字呼唤我》之后,这几天灵魂似乎更加孤独了,不知自己能否会像剧中的Elio一样幸运,遇到属于自己的Oliver……
哪怕他们的爱情昙花一现,犹如一场梦境一般,虚幻缥缈…… 电影插曲《Mestery
of Love》以及片尾曲《Visons of
Gideon》一遍又一遍地单曲循环,在每一个无人的漆黑夜晚,就这样,静静地,静静地,一个人,独自循环在这样一种禁忌之恋的梦幻中……
如果,自己不会长大,就好了

今天探讨一下使用JavaScript循环时遇到的坑。

每一个世界应该只有两次循环,或许也就只有这一个世界,包括无线电的存在与世界的改变,都是这个世界的历程。因为大叔死前说过,无线电会重启,而这与后序说的是不同的。每次循环的结尾是下一次循环的开始,无线电从大叔死的那次开始,即最后一次接触无线电那次开始,而到男一死结束,大叔死亡时间也决定了下一次接到循环的大叔所处时间,从什么时候开始吧。循环到好为止,而剧中是很多循环中的其中一个,可能不是最好的一段循环,但也因此跌宕起伏。循环也就是编剧的希望,社会越来越好的希望。

图片 1

for循环

请看下面两个循环,TODO都是相同的,哪个效率高一些呢?

// 定义一个6亿多长度的数组,不要问我为什么定义这个长度,第一它足够大,第二只是为了吉利而已
var arr = new Array(666666666);    
for(var i=0;i<arr.length;i++){
  // TODO
}

for(var i=0,length=arr.length;i<length;i++){
  // TODO
}

如果您仔细分析for循环的执行顺序,就会发现第二个的效率要高于第一个,我们把for循环看成下面的代码:

for(语句1;语句2;语句3){
  语句4;
}

执行顺序

根据执行顺序我们找到了问题所在,每次判断语句2的时候第一种情况的for循环都会取arr.length的值,相当于取了6亿多次!而第二种for循环arr.length的值只在语句1中取一次,可想而知,当遍历的数组长度特别大的时候,第二种的效率明显要高于第一种。
下面我们探讨一下变量i,for循环结束后,i还是会存在的,直到其生命周期结束i的内存才会被回收。如果处理不好会造成内存泄漏,或者变量i跟其他同名变量的值搞混淆,造成不必要的错误,如果想把变量i的内存及时释放了,可以把代码改成:

(function(){
for(var i=0,length=arr.length;i<length;i++){
  // TODO
})();

这是一个自执行函数(其本质其实是个闭包),函数执行完毕后,变量i的内存随即被释放。同样,接下来要讲解的for...in循环中的变量i也存在这种问题。

© 本文版权归作者  轻轻轻
 所有,任何形式转载请联系作者。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图