~文法メモ~ 関数の引数

デフォルト引数

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);