~文法メモ~ 関数の引数

  • デフォルト引数

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

    2番めの引数で、undefined(nullではない)を渡してもデフォルト引数が利用されます

    function setBackgroundColor(element, color = 'rosybrown') {
      element.style.backgroundColor = color;
    }
    
    setBackgroundColor(someDiv);            // color に 'rosybrown' が設定される
    setBackgroundColor(someDiv, undefined); // これも color に 'rosybrown' が設定される
    setBackgroundColor(someDiv, 'blue');    // color に 'blue' が設定される
    
  • デフォルト引数は後続のデフォルト引数で再利用可能

    n番目の引数を使って、n+1番め以降の後続の引数のデフォルト値とすることが出来ます。

    function mul(a, b = a) {
        return a * b;
    }
    
    hm.debuginfo( mul(3) ); // 9
    

    式などもデフォルト引数に出来ます

    この性質を利用すれば、引数が渡されていないとエラーを出すことなども可能です。

    function CheckArgumentException() {
        return "NoArgumentException";
    }
    
    function abc( val = CheckArgumentException() ) {
        return val.toString();
    }
    
    hm.debuginfo( abc() ); // "NoArgumentException"
    
  • 関数と名前付き引数

    分割代入の性質を利用することで、関数の引数を名前引数であるかのように扱うことが出来ます。
    このテクニックは様々なスクリプト言語で利用されています。

    function mywindow({top = 10, left = 10, width = 100, height = 60}) {
        return [top, left, width, height]
    }
    
    hm.debuginfo(mywindow({top:200, height:300})); // [200,10,100,300]
    

    分割代入の機能を利用しているだけですので、特定の値だけを取り出す目的にも使えます

    function printtop({top}) {
        hm.debuginfo(top)
    }
    
    let data = {top:200, height:300};
    printtop(data);
    
  • 可変長引数

    function sum(...args) {
        let sum = 0;
        for(let n of args) {
            sum += n;
        }
        return sum
    }
    
    hm.debuginfo(sum(100,200,300));
    
    
  • 配列を複数個の引数へと展開する

    function sum(...args) {
        let sum = 0;
        for(let n of args) {
            sum += n;
        }
        return sum
    }
    
    let sum1 = sum(10,20,30)
    hm.debuginfo(sum1);
    
    let arr = [10,20,30]
    let sum2 = sum(...arr) // 配列を引数リストに展開
    hm.debuginfo(sum2);