JavaScript:関数

4812 ワード

JavaScriptでは、関数はfunctionのキーワードを使用して声明しています.あとのパラメータと関数のセットです.関数はコード再使用の最小単位と考えられています.基本文法は以下の通りです.
function funcName(arg0,arg1,...,argN) {
    // do something
}
関数は、関数によって名来で呼び出されました.後ろには、ペアの括弧とパラメータがついてきます.例えば、
function speak(name) {
    alert("Hello " + name);
}
speak("  ");
関数出力の結果は「ハロー張三」です.関数定義におけるネーミングパラメータnameを文字列スティッチングの動作数として使用した.
JavaScriptの関数は、定義時に戻り値を指定する必要はありません.たとえば:
function sum(n1, n2) {
    return n1 + n2;
}
sum()関数の役割は、2つの数の和を返します.return以外は、1つの値を返すという宣言はありません.コールコードは以下の通りです.
var result = sum(1, 2);
return文を実行したら停止し、直ちに関数を終了します.したがって、return以降のステートメントは実行されません.
function sum(n1, n2) {
    return n1 + n2;
    alert("Hello JavaScript");      //     
}
return文は戻り値を持たなくてもいいです.この場合、関数はundefined値を返します.
function doSomething() {
    return;
    alert("running");   //       
}
関数に対する厳格なモードの制限:
  • は、関数をevvalまたはargmentsと命名することができません.
  • パラメータをevalまたはargmentsと命名できません.
  • 名前付きパラメータが2つの同名の場合がありません.
    パラメータ
    JavaScript関数のパラメータは他の言語のパラメータとは異なります.JavaScript関数は、渡されたパラメータの個数とデータの種類を無視します.つまり、定義された関数が2つのパラメータだけを受信しても、このパラメータを呼び出しても、必ずしも2つのパラメータを伝える必要はないということです.なぜなら、JavaScriptのパラメータは内部では1つの配列で表されているからです.関数が受信したのはこの配列で、配列にどのパラメータが含まれているかに関心がありません.このパラメータ配列は関数の体内でargmentsオブジェクトによってアクセスでき、関数に伝達される各パラメータを取得する.
    argmentsオブジェクトは配列と似ているだけで、Arayの例ではない.各パラメータ(例えば、最初のパラメータはargments[0]であり、2番目のパラメータはargments[1]である.)には、length属性を用いて転送入力のパラメータの個数を決定する.
    // function speak(name, age)
    function speak() {
        alert("I'm " + arguments[0] + ",and I'm " + arguments[1]);
    }
    関数にはネーミングパラメータが含まれていません.nameおよびage識別子はないが、関数の機能は変わらない.これはJavaScript関数の重要な特徴を説明しています.ネーミングのパラメータは便利であるが、必要ではないです.
    また、JavaScriptでは、解析器はネーミングパラメータを検証しません.argmentsオブジェクトのlength属性にアクセスして、どれぐらいのパラメータがあるかを知ることができます.その後、呼び出し時にパラメータの個数を入力します.
    function howManyArgs() {
        alert(arguments.length);
    }
    howManyArgs("  ", 19);  // 2
    howManyArgs(19);        // 1
    howManyArgs();          // 0
    この特徴を利用して、関数に任意の複数のパラメータを受信させ、対応する機能を実現することができる.たとえば:
    function doSum() {
        if (arguments.length == 1) {
            alert(arguments[0] + 1);
        } else if (arguments.length == 2) {
            alert(arguments[0] + arguments[1]);
        }
    }
    doSum(1);   // 2
    doSum(2, 3);// 5
    一方、argmentsはネーミングパラメータと一緒に使用できます.
    function doSum(num1, num2) {
        if (arguments.length == 1) {
            alert(num1 + 10);
        } else if (arguments.length == 2) {
            alert(arguments[0] + num2);
        }
    }
    num 1の値はargments[0]の値と同じであるため、それらは交換して使用することができる(もちろん、num 2とargments[1]も同じである).
    特に、argmentsの値は、対応するネーミングパラメータの値と常に一致している.
    function doSum(num1, num2) {
        arguments[1] = 10;
        alert(arguments[0] + num2);
    }
    この関数を実行するたびに、2番目のパラメータの値は10に書き換えられます.アーグメンントオブジェクトの値は、対応するネーミングパラメータに自動的に反映されるので、アーグメンツ[1]を変更し、num 2を修正したら、いずれも10になります.この2つの値は同じメモリ空間にはアクセスしません.メモリ空間は独立していますが、その値は同期しています.また、パラメータが一つだけ入ってくると、アーグメンント[1]に設定された値はネーミングパラメータには反映されません.argmentsオブジェクトの長さは、パラメータを定義する命名パラメータの個数によって決まるのではない.
    最後の点は、伝達値がないパラメータが自動的にundefined値に与えられます.例えば、doSum()関数に一つのパラメータを渡すだけで、num 2にundefined値が保存されます.
    JavaScriptの中のすべてのパラメータは値で伝達されています.引用によってパラメータを伝達することは不可能です.
    再読み込み
    JavaScriptの関数は署名されていないので、Javaのようなリロードはできません.
    function doAddNum(num) {
        return num + 1;
    }
    
    function doAddNum(num) {
        return num + 2;
    }
    
    var result = doAddSum(0);   // 2
    上記の例では、関数doAddSum()は2回定義されています.後に定義された関数は、先に定義された関数を上書きしますので、doAddSum()関数を呼び出すと、次のdoAddSum()関数が呼び出されます.