所谓缓存,通俗点讲就是把已经做过的事情结果先暂时存起来,下次再做同样的事情,不用再重新去做,只要把之前的存的结果拿出来用即可,很明显大大提升了效率。他的应用场景非常广泛。如:

1、缓存ajax结果,大多数网站都会有产品推荐功能,比如按热销推荐,简单低效的做法,每次点击切换的时候,都要通过ajax去数据库中取出结果,其实他的结果并不是要实时去获取,完全可以用缓存技术保存起来,减少数据库处理压力

2、单例模式,也是缓存的应用

一、缓存原理与应用

我们先来一个的简单例子,比如,判断一个数是不是素数,普通的做法:

  1. function isPrime( n ){
  2. if( n ==1 ) {
  3. return false;
  4. }else {
  5. var flag = true;
  6. for( var i = 2; i < n; i++ ){
  7. if( n % i == 0 ) {
  8. flag = false;
  9. break;
  10. }
  11. }
  12. return flag;
  13. }
  14. }
  15. alert( isPrime( 1 ) );
  16. alert( isPrime( 1 ) );

每次调用isPrime都需要去把这个函数完整的执行一遍,如果判断的素数比较大,那么程序每次都要做大量的循环判断计算,耗时很大。第一次为了获取到结果,肯定是要完整的执行一遍程序,而第二次做重复的事情,就没有必要再去完整的执行一次,我们完全可以把第一次的结果缓存起来,第二次再次判断1是不是素数,直接返回结果即可.

利用缓存技术,改进之后的素数判断:

  1. function isPrime(value){
  2. if ( !isPrime.answers ) isPrime.answers = {};
  3. if( isPrime.answers[value] != null ){
  4. return isPrime.answers[value];
  5. }
  6. var flag = value != 1;
  7. for( var i = 2; i < value; i++ ){
  8. if ( value % i == 0 ) {
  9. flag = false;
  10. break;
  11. }
  12. }
  13. return isPrime.answers[value] = flag;
  14. }
  15. alert( isPrime( 2 ) );
  16. alert( isPrime.answers[2] );

我们为函数动态添加一个属性answers,在第13行,存储每个被计算过的素数结果,下次再判断同样的素数,在第3行判断是否存着结果,然后返回即可,不用再重新做循环判断.

还有,javascript要做点东西,dom操作是很频繁的,如果获取同样的dom元素,完全可以采用缓存技术把他们存起来

html代码:

  1. <input type="button" value="按钮1">
  2. <input type="button" value="按钮2">
  3. <input type="button" value="按钮3">
  4. <input type="button" value="按钮4">
  5. <input type="button" value="按钮5">
  1. function getElements( name ) {
  2. if ( !getElements.cache ) getElements.cache = {};
  3. return getElements.cache[name] =
  4. getElements.cache[name]
  5. || document.getElementsByTagName( name );
  6. }
  7.  
  8. console.log( getElements( "input" ) );
  9. console.log( getElements.cache["input"].length );

第二次调用getElements( 'input' ) 直接就会从getElements.cache['input']把元素返回,不用再去页面查找dom元素。

二、函数重载原理与应用

所谓函数重载,通俗点理解,可以认为一个函数名,可以出现多种参数,实现不同的功能,比如,加法运算,1个数的时候,直接显示,2个数的时候,求2个数的和,

3个数的时候,求3个数的和。还有,在强类型(编译阶段确定类型)语言中,重载的参数是区分类型的.

在javascript中,默认是没有函数重载的,同名函数会产生覆盖,最后一个会把前面的函数覆盖.

通常,我们可以通过arguments来做文章:

  1. var obj = {
  2. show : function(){
  3. switch( arguments.length ){
  4. case 0:
  5. alert( 'ghostwu' );
  6. break;
  7. case 1:
  8. alert( arguments[0] );
  9. break;
  10. case 2:
  11. alert( arguments[0] + arguments[1] );
  12. break;
  13. }
  14. }
  15. }
  16. obj.show(); //ghostwu
  17. obj.show( 'ghostwu' ); //ghostwu
  18. obj.show( 10, 20 ); //

这样就实现了一个简单的重载,show方法,在不同的参数个数下,实现的功能不一样,但是这种重载方式,扩展性很差,如果有四个参数,5个参数,6个参数。。。。等等,那么就要添加分支了,接下来,我们就来看一个狂炫酷拽叼咋天的实现,不需要修改源码,可以任意增加函数重载功能.

  1. function addMethod( obj, name, fn ) {
  2. var old = obj[name];
  3. obj[name] = function(){
  4. if ( fn.length == arguments.length ){
  5. return fn.apply( this, arguments );
  6. }else if ( typeof old == 'function' ){
  7. return old.apply( this, arguments );
  8. }
  9. }
  10. }
  11.  
  12. var person = { userName : 'ghostwu' };
  13. addMethod( person, 'show', function(){
  14. alert( this.userName + '---->' + 'show1' );
  15. } );
  16. addMethod( person, 'show', function( str ){
  17. alert( this.userName + '---->' + str );
  18. } );
  19. addMethod( person, 'show', function( a, b ){
  20. alert( this.userName + '---->' + ( a + b ) );
  21. } );
  22. person.show();
  23. person.show( 10 );
  24. person.show( 10, 20 );

这样扩展的函数,如果再想添加4个,5个。。。任意参数的功能就非常的方便。完全不需要去函数体中修改,增加分支什么的.

[js高手之路]性能优化技巧 - 缓存与函数重载实战的更多相关文章

  1. [js高手之路] es6系列教程 - 新的类语法实战选项卡

    其实es6的面向对象很多原理和机制还是ES5的,只不过把语法改成类似php和java老牌后端语言中的面向对象语法. 一.用es6封装一个基本的类 class Person{ constructor( ...

  2. [js高手之路]html5 canvas动画教程 - 下雪效果

    利用canvas,实现一个下雪的效果,我们先预览下效果: 我们先分析下这个效果: 1,随机产生雪花 2,雪花的产生不是同时产生,而是有先后顺序的 3,雪花怎么表示 4,怎么源源不断的下雪 5,雪花有大 ...

  3. jQuery 性能优化技巧

    原文地址:jQuery 性能优化技巧 博客地址:http://www.extlight.com 一.使用最新版本 jQuery 类库 二.合理使用选择器 # 推荐使用 $("#id" ...

  4. SQL性能优化技巧

    作者:IT王小二 博客:https://itwxe.com 这里就给小伙伴们带来工作中常用的一些 SQL 性能优化技巧总结,包括常见优化十经验.order by 与 group by 优化.分页查询优 ...

  5. Java程序性能优化技巧

    Java程序性能优化技巧 多线程.集合.网络编程.内存优化.缓冲..spring.设计模式.软件工程.编程思想 1.生成对象时,合理分配空间和大小new ArrayList(100); 2.优化for ...

  6. [js高手之路]深入浅出webpack教程系列6-插件使用之html-webpack-plugin配置(下)

    上文我们对html-webpack-plugin的实例htmlWebpackPlugin进行了遍历分析,讲解了几个常用属性( inject, minify )以及自定义属性的添加,本文,我们继续深入他 ...

  7. [js高手之路]Node.js+jade+mongodb+mongoose实现爬虫分离入库与生成静态文件

    接着这篇文章[js高手之路]Node.js+jade抓取博客所有文章生成静态html文件继续,在这篇文章中实现了采集与静态文件的生成,在实际的采集项目中, 应该是先入库再选择性的生成静态文件.那么我选 ...

  8. JavaScript 性能优化技巧分享

    JavaScript 作为当前最为常见的直译式脚本语言,已经广泛应用于 Web 应用开发中.为了提高Web应用的性能,从 JavaScript 的性能优化方向入手,会是一个很好的选择. 本文从加载.上 ...

  9. Unity UI性能优化技巧

    本文将介绍一些提升Unity UI性能的技巧.更多优化技巧,可以观看Unity工程师Ian Dundore在Unite Europe 2017的演讲<使用Unity性能提升技巧>. 1.划 ...

随机推荐

  1. 终极锁实战:单JVM锁+分布式锁

    目录 1.前言 2.单JVM锁 3.分布式锁 4.总结 =========正文分割线================= 1.前言 锁就像一把钥匙,需要加锁的代码就像一个房间.出现互斥操作的场景:多人同 ...

  2. Golang使用pprof和qcachegrind进行性能监控

    Golang为我们提供了非常方便的性能测试工具pprof,使用pprof可以非常方便地对Go程序的运行效率进行监测.本文讲述如何使用pprof对Go程序进行性能测试,并使用qcachegrind查看性 ...

  3. This Adroid SDK r…

    有时候开启eclipse时会出现如下提示框: This Adroid SDK requires Android Developer

  4. nessus重置密码

    许久不用的nessus密码居然忘记了,查了下: cmd下进入到nessus的安装目录 提升为管理员,登录系统 如果想用之前的账号,可以直接在系统内重置密码.

  5. NYOJ--541--最强DE 战斗力(递推)

    最强DE 战斗力 时间限制:1000 ms  |  内存限制:65535 KB 难度:3   描述 春秋战国时期,赵国地大物博,资源非常丰富,人民安居乐业.但许多国家对它虎视眈眈,准备联合起来对赵国发 ...

  6. 个人php开发之工具--sublime主题配置(二)

    摘要:俗话说:工欲善其事,必先利其器.作为一名开发者来说,熟练的使用工具可以达到事半功倍的效果,我就我自己使用的工具说自己的看法.当然,每个人对某个软件都有自己的看法或使用经验,还是那句老话,什么是最 ...

  7. Unity NGUI Tween动画回调不执行问题

    最近工作中遇到了一个问题 NGUI的Tween动画完成 回调函数 偶尔不执行 偶现Bug 今天我仔细看了下代码发现 TweenPosition tempTween = varTar.GetCompon ...

  8. The method makeText(Context, CharSequence, int) in the type Toast is not applicable for the arguments (new View.OnClickListener(){}, String, int)

    package comxunfang.button; import android.support.v7.app.ActionBarActivity; import android.os.Bundle ...

  9. Entity Framework Core 2.0 新特性

    本文翻译来自:https://docs.microsoft.com/en-us/ef/core/what-is-new/index 一.模型级查询过滤器(Model-level query filte ...

  10. BOM部分笔记整理

    BOM部分整理 (章节 8.9) 概览: 一.介绍BOM 在web中,JS的核心对象就是BOM. 1.1 在浏览器中,window对象 == global 所以,你在全局环境下定义的变量,函数都会自动 ...