JS 函數(arguments、箭頭函數、bind)


參數

  函數內部可用的 arguments 對象來訪問函數的實參

  注意

  • 在函數遞歸調用的時候(在某一刻同一個函數運行了多次,也就是有多套實參),那么 arguments 屬性的值是最近一次該函數調用時傳入的實參
  • 如果函數不在執行期間,那么該函數的 arguments 屬性的值是 null
  • arguments對象不是一個 Array 。它類似於Array,但除了length屬性和索引元素之外沒有任何Array屬性。例如,它沒有 pop 方法,但是可以使用Array.prototype.pop.call(arguments,obj)借用Array方法
  • 使用擴展運算符的方法可以講arguments對象展開成一個真正的數組  例如:
    var args = [...arguments];
  • argument.callee 屬性包含正在執行函數,這在函數的名稱是未知時很有用,例如在沒有名稱的函數表達式 (也稱為“匿名函數”)內
    //計算階乘
    function factorial(n){ if(n == 1){ return 1 } return n*arguments.callee(n-1); } console.log(factorial(5));

     

bind 方法

  JavaScript新手經常犯的一個錯誤是將一個方法從對象中拿出來,然后再調用,希望方法中的 this 是原來的對象(比如在回調中傳入這個方法)。如果不做特殊處理的話,一般會丟失原來的對象。從原來的函數和原來的對象創建一個綁定函數

var module = { x: 42, getX: function() { return this.x; } } var unboundGetX = module.getX; console.log(unboundGetX()); // 這里輸出的是全局環境下 x 變量
var boundGetX = unboundGetX.bind(module); //綁定對象
console.log(boundGetX()); // expected output: 42

 

箭頭函數

  在箭頭函數出現之前,每個新定義的函數都有它自己的 this值(在構造函數的情況下是一個新對象,在嚴格模式的函數調用中為 undefined,如果該函數被稱為“對象方法”則為基礎對象等)例如

function Person() { // Person() 構造函數定義 `this`作為它自己的實例.
  this.age = 0; setInterval(function growUp() { // 在非嚴格模式, growUp()函數定義 `this`作為全局對象, 
    // 與在 Person()構造函數中定義的 `this`並不相同.
    this.age++; }, 1000); } var p = new Person();

過去的解決辦法是在 Person中新建一個變量指向this 例如 var that = this

箭頭函數的出現解決了這個問題,箭頭函數不會創建屬於自己的this,它使用封閉執行上下文的this值。因此,在下面的代碼中,傳遞給setInterval的函數內的this與封閉函數中的this值相同

function Person(){ this.age = 0; setInterval(() => { this.age++; // |this| 正確地指向person 對象
  }, 1000); } var p = new Person();

注意

  • 箭頭函數不綁定Arguments 對象
  • 箭頭函數只能用於非方法函數
  • 箭頭函數不能作為構造函數
  • 箭頭函數沒有property屬性

最后來看一下箭頭函數使用語法

(參數1, 參數2, …, 參數N) => { 函數聲明 } (參數1, 參數2, …, 參數N) => 表達式(單一) //相當於:(參數1, 參數2, …, 參數N) =>{ return 表達式; } // 當只有一個參數時,圓括號是可選的:
(單一參數) => {函數聲明} 單一參數 => {函數聲明} // 沒有參數的函數應該寫成一對圓括號。
() => {函數聲明}

 

默認參數

  JS函數也可以在聲明參數時賦默認值,如果不給默認值,JavaScript 中函數的參數默認是undefined

function multiply(a, b = 1) { return a * b; }

 

剩余參數

  剩余參數語法允許我們將一個不定數量的參數表示為一個數組

function(a, b, ...theArgs) { // ...
}

  剩余參數和 arguments對象之間的區別主要有三個:

  • 剩余參數只包含那些沒有對應形參的實參,而 arguments 對象包含了傳給函數的所有實參。
  • arguments對象不是一個真正的數組,而剩余參數是真正的 Array實例,也就是說你能夠在它上面直接使用所有的數組方法,比如 sort,map,forEach或pop。
  • arguments對象還有一些附加的屬性 (如callee屬性)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM