JavaScript如何重构嵌套循环和递归

2016-02-20 00:50 14 1 收藏

岁数大了,QQ也不闪了,微信也不响了,电话也不来了,但是图老师依旧坚持为大家推荐最精彩的内容,下面为大家精心准备的JavaScript如何重构嵌套循环和递归,希望大家看完后能赶快学习起来。

【 tulaoshi.com - Web开发 】

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

这篇是Nicholas讨论如果防止脚本失控的第二篇,主要讨论了如何重构嵌套循环、递归,以及那些在函数内部同时执行很多子操作的函数。基本的思想和上一节trunk()那个例子一致,如果几个操作没有特定的执行顺序,而且互相不是依赖关系,我们就可以通过异步调用的方式加以执行,不止可以减少执行的次数,还可以防止脚本失控。本文还介绍了通过memoization技术取代递归的方法。

Speed up your JavaScript, Part 2
Nicholas C. Zakas

以下是对原文的翻译

上周我在《too much happening in a loop》(译文)这篇文章中介绍了JavaScript运行时间过长的第一个原因。相似的情况有时也出现在函数的定义上,函数也可能因为使用不当而过载使用。通常情况是函数内包含了过多的循环(不是在循环中执行了过多的内容),太多的递归,或者只不过是太多不相干但又要一起执行的操作。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)

太多的循环经常是以嵌套的形式出现,这种代码会一直占用JavaScript引擎直至循环结束。这方面有一个非常著名的例子,就是使用冒泡算法排序。由于JavaScript有内置的sort()方法,我们没有必要使用这种方式进行排序,但我们可以借助这个算法理解嵌套循环占用资源的症结所在,从而避免类似情况的发生。下面是一个在JavaScript使用冒泡排序法的典型例子:

function bubbleSort(items) {
for (var i = items.length - 1; i = 0; i--) {
   for (var j = i; j = 0; j--) {
       if (items[j] items[j - 1]) {
           var temp = items[j];
           items[j] = items[j - 1];
           items[j - 1] = temp;
       }
   }
}
}

回忆一下你在学校学习的计算机知识,你可能记得冒泡排序法是效率最低的排序算法之一,原因是对于一个包含n个元素的数组,必须要进行n的平方次的循环操作。如果数组中的元素数非常大,那么这个操作会持续很长时间。内循环的操作很简单,只是负责比较和交换数值,导致问题的最大原因在于循环执行的次数。这会导致浏览器运行异常,潜在的直接结果就是那个脚本失控的警告对话框。

几年前,Yahoo的研究员Julien Lecomte写了一篇题为《Running CPU Intensive JavaScript Computations in a Web Browser》的文章,在这篇文章中作者阐述了如何将很大的javaScript操作分解成若干小部分。其中一个例子就是将冒泡排序法分解成多个步骤,每个步骤只遍历一次数组。我对他的代码做了改进,但方法的思路还是一样的:

 

function bubbleSort(array, onComplete) {
var pos = 0; (function() {
var j, value;
for (j = array.length; j pos; j--) {
if (array[j] array[j - 1]) {
value = data[j];
data[j] = data[j - 1];
data[j - 1] = value;
}
}
pos++;
if (pos array.length) {
setTimeout(arguments.callee, 10);
} else {
onComplete();
}
})();
}

这个函数借助一个异步管理器来实现了冒泡算法,在每次遍历数组以前暂停一下。onComplete()函数会在数组排序完成后触发,提示用户数据已经准备好。bubbleSort()函数使用了和chunk()函数一样的基本技术(参考我的上一篇帖子),将行为包装在一个匿名函数中,将 arguments.callee传递给setTimeout()以达到重复操作的目的,直至排序完成。如果你要将嵌套的循环拆解成若干个小步骤,以达到解放浏览器的目的,这个函数提供了不错的指导意见。

来源:http://www.tulaoshi.com/n/20160220/1632619.html

延伸阅读
标签: Web开发
数组,说得简单点,其实就是几个变量的组合,然后,我们可以通过循环来调用他们。请看下面的例子: script language="JavaScript" !-- Hide var array= new Array(256,"5D多媒体",453,999); for(i=0;i=3;i++) {document.write("数组的第"+i+"个元素是"+array[i]+"br");} // -- /script var 数组名=new Array()是对新的数组的定义,用数组表...
1、优化import 简而言之,通过优化import的设置可以达到以下的目的: 去除无用的import语句:如在类中没有使用任何包中的类,则这个包的import语句可以删除。 设置包的阈值:当前类引用包中类的数目大于这个阈值时,引入整个包(如import java.io.*),否则为包中每个被引用的类单独指定的一个import语句(如import java.io.File)。 ...
行文虽长,但全是拧干脱水的,刚接触APP设计的同学果断收藏起来吧。 Troy:大学美术史(选修)的第一堂课上,那老师开门见山的说:知道大家认真听课的不多,下节课能来多少也不知道,这里介绍一个自学阅读的办法,方便你们抱佛脚,在我看来大部分书籍讲的实质性内容都很少,这就需要拧干提纯,发现一本书有用之处最有效的方法是看目录,大家能消...
为什么要重构 从Martin Fowler所著的《重构--改善既有代码的设计》一书连续两年成为最畅销的计算机图书之一,就可以知道重构给程序员所带来的欣喜程度了。 !-- frame contents -- !-- /frame contents -- 那么什么是重构呢?重构就是在不改变软件现有功能的基础上,通过调整程序代码改善软件的质量、性能...
标签: Web开发
虽然 JavaScript 与Java有紧密的联系,但却是两个公司开发的不同的两个产品。Java是SUN公司推出的新一代面向对象的程序设计语言,特别适合于Internet应用程序开发;而JavaScript是Netscape公司的产品,其目的是为了扩展Netscape Navigator功能,而开发的一种可以嵌入Web页面中的基于对象和事件驱动的解释性语言,它的前身是Live Script;而Ja...

经验教程

875

收藏

90
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部