js重載的實現

来源:http://www.cnblogs.com/tzzf/archive/2017/12/04/7979126.html
-Advertisement-
Play Games

在JavaScript高級程式設計書中看到 因此,要模擬出重載的效果,只有兩種方法:1.參數的類型;2.參數的數量 本人一開始學會的通過參數類型來實現重載的方法 用Switch 語句通過參數類型來模擬出重載效果。 關於Switch 語句還有個有個小技巧:case的連續執行 當執行函數sum('sum ...


在JavaScript高級程式設計書中看到

ECMAScript函數中不能想傳統意義上那樣實現重載。而在其他語句中(Java)中,可以為一個函數編寫兩個定義,只要兩個定義的簽名(接受的參
數的類型和數量)不同即可。如前所述,ECMAScript函數沒有簽名,因為其參數是由包含多個值的數組來表示的。而沒有函數簽名,真正的重載是不可做到
的。但是ECMAScript函數可以通過檢查傳入函數中的參數的類型和數量並做出不同的反應,可以去模擬方法的重載。
深入理解的例子:
function addsomeSomeNumber(num){
  return num+=100;
}
function addsomeSomeNumber(num){
  return num+=200;
}

addsomeSomeNumber(100)//300

顯然,這個例子中聲明瞭兩個同名函數,而結果則是後面的函數覆蓋了前面的函數。

因此,要模擬出重載的效果,只有兩種方法:1.參數的類型;2.參數的數量

本人一開始學會的通過參數類型來實現重載的方法

function sum(type,a,b){
    switch(type)
    {
        case 'sum':
          return a+b;
          break;
        case 'mul':
          return a*b;
          break;
    }
} 

用Switch 語句通過參數類型來模擬出重載效果。

關於Switch 語句還有個有個小技巧:case的連續執行

function sum(type,a,b){
    var s=0;
    switch(type)
    {
        case 'sum':
          s += a+b;
        case 'mul':
          s += a*b;
          return s;    
          break;
    }
}

當執行函數sum('sum',1,2)時,他會執行出值,明明case 'sum'沒有return,也會有值,因為函數沒遇到break,它也運行了case ‘mul’的函數。

當然重載還有別的方式實現,下麵就介紹argument,在JavaScript高級程式設計是這麼寫的

在ECMAScript中的參數在內部用一個數組(類數組)來表示。在函數體內可以通過arguments對象來訪問這個參數數組,從而獲取函數每一個參數。
arguments對象只是與數組類似(它並不是Array的實例),因為可以使用方括弧語法訪問ta它每一個元素(即第一個元素是arguments[0]以此類推),
使用length屬性來確定他傳遞進來多少個參數。

故可以用 arguments.length 來實現重載

var HeavyLoad = function () {
  var length = arguments.length; //獲取函數實參的個數
  if (length === 0) {
      console.log('no-param');
      return this;
  } else if(length === 1) {
      console.log('1');
      return this;
  } else if(length ===2) {
      console.log('2');
      return this;
  } else {
      console.log('3');
      return this;
  }
};
HeavyLoad('a','b','c') //3

也可以根據傳參的類型來重載

var HeavyLoad= function () {
    if (typeof arguments[0] === 'number') {
        console.log('number');
    }

    if (typeof arguments[0] === 'string') {
        console.log('string');
    }
 };
HeavyLoad(1) //number

遞歸階乘函數的實現

arguments.callee是一個指向正在執行的函數指針,因此用它來是實現對函數的遞歸調用。(註釋下js是單線程的,所以指向正在執行的函數,就是指向自己)
function factorial(num){
     if(num <= 1){
        return   1;
    }  else{
        return num * arguments.callee(num-1);
    }
}

 


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

-Advertisement-
Play Games
更多相關文章
  • SVG作為時下比較新穎的技術標準,已經建立了很多基於SVG的前端項目。由於SVG在繪製路徑上非常靈活,我們將很多網頁上的元素使用SVG來繪製而成,有各種人物、小圖標、小動畫等等。今天我們收集了10個非常新奇有趣的SVG繪製動畫,這些動畫大部分都是使用SVG結合一定的CSS3特性實現而成,效果讓人大為 ...
  • 以前遇到一個問題,頁面編碼沒問題,後臺返回的編碼也沒問題,但是ajax返回的json就是不講道理的亂碼,查看過http響應頭信息發現請求編碼與頁面編碼不一致 網上搜了好多方法,包括改編碼,重新建頁面都不行! 最後解決方法: 加上了 contentType: "application/x-www-fo ...
  • 4. 前端工程化開發實踐 由於Nodejs 、npm的環境搭建往上很多,這裡就不過多介紹它們了。 這裡我們將更多介紹FIS3、RequireJS 、r.js。 4.1 模塊化開發: 4.1.1 開發目錄結構 左圖為開發目錄結構, 右圖中新增js 目錄、fis-conf.js文件,js 目錄用來存放r ...
  • 介紹ECMAScript各版本的內容,以及使用Babel把ES6及以上的代碼編譯為ES5. ...
  • 參考網址:http://blog.sina.com.cn/s/blog_6961ba9b0102wwye.html 第一次新增時沒有問題,編輯器裡面內容為空,編輯數據時,也是正常,但是第二次點擊新增時會出現編輯時的內容。 分析可能是第二次新增時還是取的上次的實例,即使用CKEDITOR.instan... ...
  • 為了完全理解這個老生常談的東西,查來查去,算是初步知道這是個什麼鬼,怎麼用,為什麼用 閉包: 外部函數定義的內部函數就是閉包。 閉包的作用及好處: 閉包給訪問外部函數定義的內部變數創造了條件。也將關於函數的一切封閉到了函數內部,減少了全局變數,這也是閉包的真實含義。 在理解閉包之前.最好能先理解一下 ...
  • 一、CSS簡介CSS全稱cascading style sheeding,層疊樣式列表。CSS不僅可以靜態地修飾網頁,還可以配合各種腳本語言動態地對網頁各元素進行格式化。二、CSS組成1、選擇器(1)標簽選擇器 (2)ID選擇器 (3)class選擇器 (4)關聯選擇器(層級選擇器,空格)類似spa ...
  • express學習(三)—— cookie和session cookie存在瀏覽器中,最大隻能保存4K數據,不安全 session存在伺服器中,不能獨立(先讀取cookie再讀取session),較安全 cookie 工具 發送cookie: 基本的東西先寫好: 讀取cookie 接著,用cooki ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...