[js高手之路]性能優化技巧 - 緩存與函數重載實戰

来源:http://www.cnblogs.com/ghostwu/archive/2017/09/03/7468739.html
-Advertisement-
Play Games

所謂緩存,通俗點講就是把已經做過的事情結果先暫時存起來,下次再做同樣的事情,不用再重新去做,只要把之前的存的結果拿出來用即可,很明顯大大提升了效率。他的應用場景非常廣泛。如: 1、緩存ajax結果,大多數網站都會有產品推薦功能,比如按熱銷推薦,簡單低效的做法,每次點擊切換的時候,都要通過ajax去數 ...


所謂緩存,通俗點講就是把已經做過的事情結果先暫時存起來,下次再做同樣的事情,不用再重新去做,只要把之前的存的結果拿出來用即可,很明顯大大提升了效率。他的應用場景非常廣泛。如:

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 ); //30

這樣就實現了一個簡單的重載,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個。。。任意參數的功能就非常的方便。完全不需要去函數體中修改,增加分支什麼的.

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 一、數組 1、數組的基本概念 數組是在記憶體空間中連續存儲的一組有序數據的集合。元素在數組中的順序,稱為下標。可以使用下標訪問數組的每個元素。 2、如何聲明一個數組 ①使用字面量聲明:var arr = [];在JS中,同一數組可以存儲各種數據類型; eg: var arr = [1,"wuhao", ...
  • 百度網盤下載地址:https://pan.baidu.com/s/1kULNXOF 具體課程目錄: 1,課程安排【已上傳】 2,gdom框架使用方法【已上傳】 課程總體大綱: ...
  • 第一:在如今這個前端的市場下,你如果太過於著急找工作而去學習,你一定找不到,有一個很簡單的道理,任何東西求快沒有用,首先你要會,學的成了半吊子,看點視頻就去找工作,沒人接收。 第二:如果沒有一套系統的學習路線和方案,這看看,那裡看看,依舊學了之後還是浪費時間,根據我的學習經歷來看,任何人學習任何東西 ...
  • 我很喜歡哆啦A夢,因為他為我的童年帶來很多的歡樂。直至如今,他的故事總能讓我感受到友情、親情、愛情,這些美好,讓人捨不得忘卻。 這是我之後突然想到的,假如哆啦A夢的道具可以出售的話... 這裡是首頁,因為沒有資源,所以使用的圖片是從網上找到的,也沒有對展示區進行美化...但是我相信,如果同樣是喜歡哆 ...
  • 使用js($.ajax中)實現頁面內跳轉(即:描點平滑跳轉)的方法(aa為跳轉目的標簽的id): 在網路上有很多資料所說的:animate方法我試了並不好使,不知道是啥原因,歡迎大家指正,附上網路方法: 經過測試,如果不需要有滑動動畫的話,可使用下麵的語句: ...
  • <!DOCTYPE html><html><head><meta charset="UTF-8"><title>fruit</title><style type="text/css"> .hide { display: none;}div { float: left; width: 100%;}.s ...
  • 在使用MVC時,向伺服器端發送POST請求時有時需要傳遞數組作為參數值 下麵使用例子說明,首先看一下Action 方式一,構造表單元素,然後調用serialize()方法得到構造參數字元串 調試模式監視參數,當點擊按鈕時,監視得到的參數如下 方式二:使用JavaScript對象作為參數傳值,參數名是 ...
  • 仿萬科底部的新聞滑動特效: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...