通常、関数を作る場合は必要な引数をあらかじめパーレンの中で変数として宣言します。

//引数が1つ
function fn1(str) {
    $.writeln (str);
}
fn1("test");
//引数が2つ必要 function fn2(x ,y) { $.writeln ("x="+x+" y="+y); } fn2(50,100);

 

しかし実のところ、Javascriptでは引数の変数を用意しなくても受け取ることができます。渡された引数(オブジェクト)は常に配列として収納されており、argumentsオブジェクトを使って取り出すことができます。

function fn0() {
    $.writeln ("len="+arguments.length);
    $.writeln (arguments[1]); //<2
}
fn0(1, 2, 3);

 

こういった性質を使えばargumentsオブジェクトを使わずとも、以下のように異なった性質を持ち合わせた関数を作ることが可能になります。

//どこかにプロパティを持ったオブジェクトが存在するとして...
var xObj={
    name: "nakatoji",
    age: 50,
    job: "alien",
    permission:false
}

//引数がなければpermissionの値を取得
//引数があればpermissionを渡された値に変更
function fnPerm(bool) {
    if (bool == undefined) {
        return xObj.permission;
    } else {
        xObj.permission= bool;
    }
}
//取得 var res= fnPerm(); $.writeln (res); //<false

//変更
fnPerm(true);

//再び取得
$.writeln (fnPerm()); //<true

 

よく見かける「第2引数以降はオプション」という関数もこういった性質を利用しています。

//こんなプロパティを持つオブジェクトがあるとして...
var xObj={
    //name: "",
    //note: ""
}

//それを設定する関数
function fnSetObj(name, opt) {
    if (name== undefined) {return false} //名前は必須
    xObj.name= name;
    opt== undefined ? xObj.note= "unknown" : xObj.note= opt; //オプション値があればそれ。そうでなければデフフォルト値(unknown)
    return true;
}

//引数を渡さない
if (fnSetObj()) {
    $.writeln ("name= "+xObj.name);
    $.writeln ("note= "+xObj.note);
} else {
    $.writeln ("err"); // falseなのでこっち
}

//最初の引数だけ渡す
xObj={}; if (fnSetObj("hiratoji")) { $.writeln ("name= "+xObj.name); //name= hiratoji $.writeln ("note= "+xObj.note); //note= unknown } else { $.writeln ("err"); } //引数を2つとも渡す
xObj={}; if (fnSetObj("nakatoji", "He is danger!")) { $.writeln ("name= "+xObj.name); //name= nakatoji $.writeln ("note= "+xObj.note); //note= He is danger! } else { $.writeln ("err"); }

 

 

 

Joomla templates by a4joomla