javascript arguments(轉)

来源:http://www.cnblogs.com/wlf1112/archive/2016/12/29/6233848.html
-Advertisement-
Play Games

什麼是arguments arguments 是是JavaScript里的一個內置對象,它很古怪,也經常被人所忽視,但實際上是很重要的。所有主要的js函數庫都利用了arguments對象。所以agruments對象對於javascript程式員來說是必需熟悉的。 所有的函數都有屬於自己的一個argu ...


什麼是arguments

arguments 是是JavaScript里的一個內置對象,它很古怪,也經常被人所忽視,但實際上是很重要的。所有主要的js函數庫都利用了arguments對象。所以agruments對象對於javascript程式員來說是必需熟悉的。

所有的函數都有屬於自己的一個arguments對象,它包括了函所要調用的參數。他不是一個數組,如果用typeof arguments,返回的是’object’。雖然我們可以用調用數據的方法來調用arguments。比如length,還有index方法。但是數 組的push和pop對象是不適用的。

創建一個靈活的函數

看起來貌似argument對象使用起來十分有限,但是實際上它是一個非常有用的對象。你可以通過使用argument對象讓函數能夠調用數量不定 的參數。在Dean Edwards的base2庫里有個格式化的函數,展示了這個靈活性。

function format(string) {   

  var args = arguments;   

  var pattern = new RegExp(“%([1-" + arguments.length + "])”, ”g”);   

  return String(string).replace(pattern, function(match, index) {   

    return args[index];   

  });   

}; 

我們提供了一個模板字元串,你可以用”%1”到“%9”給返回值添加一個占位符。然後提供給九個其他參數插入。

format(“And the %1 want to know whose %2 you %3″, ”papers”, ”shirt”, ”wear”);

上面的代碼將返回:And the papers want to know whose shirt you wear" .

有件事情我們需要註意下,在定義函數的時候,我們只規定了一個參數,string。Javascript允許我們傳遞任何數量的參數到一個函數里,不管怎麼定義這個函數。Arguments對象對這些都是允許的。

把arguments對象轉換成一個真正的數組

雖然arguments對象不是一個真正的javascript數組,但是我們還是可以輕易的把它轉換成標準的數據 ,然後進行數組操作。

var args = Array.prototype.slice.call(arguments); 

那麼現在這個變數args就含有一個含有函數所有參數的標準javascript數組對象。

通過預置的arguments對象創建函數

Arguments對象允許我們去執行所有類型的javascript方法。這邊附上一個makeFunc函數的定義。這個函數允許我們去提供一個函數引用和這個函數的所有參數。他將返回一個匿名函數去調用你規定的函數,也提供了匿名函數調用時所附帶的參數。

function makeFunc() {   

  var args = Array.prototype.slice.call(arguments);   

  var func = args.shift();   

  return function() {   

    return func.apply(null, args.concat(Array.prototype.slice.call(arguments)));   

  };   

}

第一個argument對象給makeFunc提供了你想調用的函數的引用。他是從arguments數組裡移除的。然後makeFunc返回了一個匿名函數去運行規定的方法。

第一個應用的argument指向了函數調用的範圍,主要是函數內部關鍵部分所指向的。我們先保持這個為null。第二個arguments是一個 數組,會為這個函數轉變為arguments對象。makeFunc把原始的數組值串聯到arguments對象里提供給匿名函數和所調用函數的數組。

你需要輸出一個模板總是相同的位置,這樣就可以不用總是在每次引用模板的時候調用format函數。你可以使用makeFunc的通用功能去返回可以調用format然後自動補充模板的函數。

var majorTom = makeFunc(format, ”This is Major Tom to ground control. I’m %1.”);

你可以像這樣調用majorTom函數:

majorTom(“stepping through the door”);   

majorTom(“floating in a most peculiar way”);

每一次你調用majorTom,它會同時調用format函數和第一個argument,已經寫好的模板。那麼將返回

“This is Major Tom to ground control. I’m stepping through the door.”   

“This is Major Tom to ground control. I’m floating in a most peculiar way.”

創建引用自身的函數

你可能覺得這樣很酷,不過,arguments還有更多的驚喜。他還有其他有用的特性:callee方法 。Arguments.callee包括了一個函數的引用去創建一個argument對象。那麼該如何使用呢?

Arguments.callee方法能讓一個匿名函數很方便的指向本身。

Repeat是一個承載了一個函數引用和兩個數字的函數。第一個數字是函數調用幾次,第二個數字是每個調用的間隔時間,單位是毫秒。

function repeat(fn, times, delay) {   

  return function() {   

    if(times– > 0) {   

      fn.apply(null, arguments);   

      var args = Array.prototype.slice.call(arguments);   

      var self = arguments.callee;   

      setTimeout(function(){self.apply(null,args)}, delay);   

    }   

  };   

}  

Repeat函數使用了arguments.callee方法從變數self去獲取一個引用,指向運行原始指令的函數。這樣,匿名函數就可以再次調用本身。

我有一段超級簡介的函數,承載了一個字元串和執行alert方法。

function comms(s) {   

  alert(s);   

}  

然而,我想創建一個特殊的版本,通過這個版本我可以重覆這個動作三次,每次間隔2秒鐘。那麼,我們可以

var somethingWrong = repeat(comms, 3, 2000);   

somethingWrong(“Can you hear me, major tom?”); 

調用了somethingWrong函數的結果就是復這個動作三次,每次alert間隔2秒鐘。

Arguments雖然不是經常用到,有點古怪,但是,它充滿了驚喜,非常值得我們去瞭解 。

原文地址:arguments : A JavaScript Oddity



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

-Advertisement-
Play Games
更多相關文章
  • 首先介紹預解析,雖然預解析字面意思很好理解,但是卻是出坑出的最多的地方,也是bug經常會有的地方,利用好預解析的特性可以解決很多問題,並且提高代碼的質量及數量,瀏覽器在解析代碼前會把變數的聲明和函數(整個函數體)提前到當前作用域的最頂端。 細節問題: 在多對的script標簽中如果有相同的函數,那它 ...
  • 本文主要講述採用Html5+jQuery+CSS 製作相冊的小小記錄。 主要功能點: Html5進行佈局 調用jQuery(借用官網的一句話:The Write Less, Do More)極大的簡化了JavaScript編程 CSS 樣式將表現與內容分離 話不多說,先上效果圖: 代碼如下: 1 < ...
  • Ajax的概念 AJAX即“Asynchronous Javascript And XML”(非同步JavaScript和XML),是一種用於創建快速動態網頁的技術。 動態網頁:是指可以通過伺服器語言結合資料庫隨時修改數據的網頁。 靜態網頁,隨著html代碼的生成,頁面的內容和顯示效果就基本上不會發生 ...
  • index - 選擇器的 index 位置 element - 當前的元素(也可使用 "this" 選擇器) ...
  • 1.開啟“QQ線上狀態”服務 http://jingyan.baidu.com/article/b24f6c823425a586bfe5da1f.html 2.選擇一種合適的用在網站中 http://www.lanrenzhijia.com/service/ ...
  • Canvas 的width height屬性 1、當使用width height屬性時,顯示正常不會被拉伸;如下 運行效果如下,為對角線 2、使用style時圖像會被拉伸(變形), 運行效果 如何理解???可以這麼理解———— Canvas 是一個畫板和一張畫紙,畫板相當於一個容器,畫圖/作業是在畫 ...
  • 通過css屬性 Cursor:url()自定義滑鼠游標。 url是自定義滑鼠圖標路徑 default指的是定義預設的游標(通常是一個箭頭),以防沒有由 URL 定義的可用游標。 圖標的格式根據不同的瀏覽器來分: IE支持cur,ani,ico這三種格式。 Google,FF支持bmp,gif,jpg ...
  • 什麼是 Page Visibility ? Page Visibility 即頁面可見性,通過 visibilityState 的值檢測頁面當前是否可見。當一個網站是可見或點擊選中的狀態時 Page Visibility API 可以讓你獲取到這種狀態,當用戶最小化網頁或者瀏覽到其他標簽的網頁時,A ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...