<font id="zqva1"></font>
<rt id="zqva1"></rt>
  • <tt id="zqva1"></tt>
    <cite id="zqva1"></cite>

    <cite id="zqva1"><noscript id="zqva1"></noscript></cite>
      <rp id="zqva1"><meter id="zqva1"></meter></rp>

        <cite id="zqva1"></cite>
          <b id="zqva1"></b>
          <rp id="zqva1"></rp>
          <cite id="zqva1"></cite>

          <rt id="zqva1"></rt>

        1. <rp id="zqva1"></rp>

          講解JavaScript 之arguments的詳解,arguments.callee,arguments.caller的使用方法和實例

          時間:?2017-11-07閱讀:?2023標簽:?js知識

          arguments是什么?

          arguments 是一個對應于傳遞給函數的參數的類數組對象。在(非箭頭)函數調用時,創建的一個 它類似于Array,但除了長度之外沒有任何Array屬性 的對象 ,它存儲的是實際傳遞給函數的參數(局限于函數聲明的參數列表)。此對象包含傳遞給函數的每個參數的條目,第一個條目的索引從0開始。例如:

          function fn(){ //利用instanceof判斷arguments
              console.log( 'arguments instanceof Array? ' + (arguments instanceof Array) );//false
              console.log( 'arguments instanceof Object? ' + (arguments instanceof Object) );//true
              console.log(arguments);
              console.log(arguments[0]);//string
              console.log(arguments[1]);//1
          }
          fn('string',1);

          控制臺顯示如下:


          從輸出我們可以看出arguments 是一個‘object’,帶有2個常用的屬性callee和caller(文章最后面介紹)。對應的參數可以通過條目的索引來獲取(從0開始),雖然它不擁有數組的屬性,但是我們可以把它轉換為一個正在的數組,通過Js中的apply和call,或者es6中的參數擴展的方法,代碼如下:

          //call
          var args = Array.prototype.slice.call(arguments);
          var args = [].slice.call(arguments);
          //由于slice會阻止某些Js引擎中的優化 (v8)產生一些性能問題,可以采用如下方法
          var args = (arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments));
          var args = Array.from(arguments);
          var args = [...arguments];

          通過上面的方法,我們就可以讓arguments成為一個真正的Array,我們就能獲取參數的長度length,使用array中一些方法,如Join,concat,indexOf等等。

          需要注意一點的是只有函數被調用時,arguments對象才會創建,未調用時其值為null,例如

          console.log(new Function().arguments);//return null


          arguments的例子
          下面將介紹arguments在實際項目中,常用于傳遞任意數量的參數到該函數,來對參數進行操作。

          1.累加:
          function add(...args) {
            let sum=0;
            for(let i of args){
             sum+=parseFloat(i);
            }
            return sum
          }
          add(1,2,3);//輸出6


          2.字符串鏈接:

          function concat(o) {
            let args = Array.prototype.slice.call(arguments, 1);
            return args.join(o);
          }
          concat('.','a','b','c');//輸出a.b.c


          arguments.callee的使用

          callee是arguments對象的一個成員,arguments.callee的值包含當前正在執行的函數,由于arguments在函數被調用時才有效,因此arguments.callee在函數未調用時是不存在的(即null.callee)。

          值得注意的是:在嚴格模式下,ES5禁止使用 arguments.callee,當一個函數必須調用自身的時候, 避免使用 arguments.callee, 通過要么給函數表達式一個名字,要么使用一個函數聲明。


          arguments.callee的例子
          在遞歸函數必須能夠引用它本身。很典型的,函數通過自己的名字調用自己。然而,匿名函數沒有名稱。因此如果沒有可訪問的變量指向該函數,唯一能引用它的方式就是通過arguments.callen,例如
          function create() {
             return function(n) {
                if (n <= 1)
                   return 1;
                return n * arguments.callee(n - 1);
             };
          }
          
          var result = create()(5); // returns 120 (5 * 4 * 3 * 2 * 1)

          定義了一個函數,按流程,定義并返回了一個階乘函數。該例并不是很實用,并且幾乎都能夠用 命名函數表達式 實現同樣結果的例子 。例如我們經常是這樣實現的:

          function create(n) {
              if(n <= 1)
                return 1;
              return n*create(n - 1);
          }
          var result = create(5);//120


          arguments.caller的使用

          arguments.caller屬性原先用在函數執行的時候調用自身。在一個函數調用另一個函數時,被調用函數會自動生成一個caller屬性,指向調用它的函數對象。如果該函數當前未被調用,或并非被其他函數調用,則caller為null。 

          但是arguments.caller在嚴格模式下是無法訪問的,它已經被廢棄了,至于移除原因是因為它潛在的不安全性。 所以這里就不介紹他的例子了。。。



          站長推薦

          1.阿里云: 本站目前使用的是阿里云主機,安全/可靠/穩定。點擊領取2000元代金券、了解最新阿里云產品的各種優惠活動點擊進入

          2.騰訊云: 提供云服務器、云數據庫、云存儲、視頻與CDN、域名等服務。騰訊云各類產品的最新活動,優惠券領取點擊進入

          3.廣告聯盟: 整理了目前主流的廣告聯盟平臺,如果你有流量,可以作為參考選擇適合你的平臺點擊進入

          鏈接: http://www.modern-decoration.com.cn/article/detial/59

          base91 for javascript

          原理和 base64 是一樣的,ASCII 共有94個可打印字符,base64 使用了其中 64 個,base91 使用了 91 個。

          javascript中什么是句柄?

          一個句柄是指使用的一個唯一的整數值,即一個4字節(64位程序中為8字節)長的數值,來標識應用程序中的不同對象和同類中的不同的實例。

          javascript不可變性是什么?

          不可變性即某個變量在進行了某個操作之后,其本身沒有發生變化,比如對于字符串而言,對字符串的任何操作都會改變字符串本身的值,而是在字符串的基礎上復制出來一個然后再改變,這樣我們就說是不可變的

          為什么javascript不起作用?

          JavaScript是一種屬于網絡的腳本語言,已經被廣泛用于Web應用開發,常用來為網頁添加各式各樣的動態功能,為用戶提供更流暢美觀的瀏覽效果。通常JavaScript腳本是通過嵌入在HTML中來實現自身的功能的。

          javascript怎么判斷按鈕被點擊?

          JavaScript可以通過Event對象的target事件或srcElement(IE瀏覽器支持)來判斷按鈕是否被點擊。Event對象代表事件的狀態,比如事件在其中發生的元素、鍵盤按鍵的狀態、鼠標的位置、鼠標按鈕的狀態。

          javascript由幾部分組成?

          JavaScript有三部分組成。分別為核心(ECMAScript) 、文檔對象模型(DOM)、瀏覽器對象模型(BOM)。這三部分分別描述了該語言的語法和基本對象、處理網頁內容的方法和接口、與瀏覽器進行交互的方法和接口。

          Js輸出方式有哪些?

          在編寫JavaScript代碼的時候, 一定要記住每一句代碼后面都需要添加一個分號, 并且這個分號必須是英文的分號,我們會發現有時候不寫分號程序也能夠運行, 這里并不是因為不需要分號, 而是瀏覽器自動幫助我們添加了分號

          7個常見的 JavaScript 測驗及解答

          我相信學習新事物并評估我們所知的東西對自己的進步非常有用,可以避免了我們覺得自己的知識過時的情況。在本文中,我將介紹一些常見的 JavaScript 知識。請享用!

          JavaScript中“javascript:void(0) ”是什么意思

          expression 是一個要計算的 Javascript 標準的表達式。表達式外側的圓括號是可選的,鑒于規范化,以及養成好習慣,建議寫上去。當我們使用 void 操作符指定超級鏈接時,表達式會被計算但是不會在當前文檔處裝入任何內容。

          Js中constructor指向問題

          首先用一個例子指出來constructor存在形式。由上面的代碼我們總結出結論1:上面的代碼在控制臺可以看出constructor是指向構造器Fruit的引用。這個地方就有點奇怪了。這個constructor到底指向的是那個實例的構造器?

          內容以共享、參考、研究為目的,不存在任何商業目的。其版權屬原作者所有,如有侵權或違規,請與小編聯系!情況屬實本人將予以刪除!

          文章投稿關于web前端網站點搜索站長推薦網站地圖站長QQ:522607023

          小程序專欄: 土味情話心理測試腦筋急轉彎幽默笑話段子句子語錄成語大全運營推廣

          国产精品高清视频免费 - 视频 - 在线观看 - 影视资讯 - 唯爱网