JavaScript:関数
4812 ワード
JavaScriptでは、関数はfunctionのキーワードを使用して声明しています.あとのパラメータと関数のセットです.関数はコード再使用の最小単位と考えられています.基本文法は以下の通りです.
JavaScriptの関数は、定義時に戻り値を指定する必要はありません.たとえば:は、関数をevvalまたはargmentsと命名することができません. パラメータをevalまたはargmentsと命名できません. 名前付きパラメータが2つの同名の場合がありません.
パラメータ
JavaScript関数のパラメータは他の言語のパラメータとは異なります.JavaScript関数は、渡されたパラメータの個数とデータの種類を無視します.つまり、定義された関数が2つのパラメータだけを受信しても、このパラメータを呼び出しても、必ずしも2つのパラメータを伝える必要はないということです.なぜなら、JavaScriptのパラメータは内部では1つの配列で表されているからです.関数が受信したのはこの配列で、配列にどのパラメータが含まれているかに関心がありません.このパラメータ配列は関数の体内でargmentsオブジェクトによってアクセスでき、関数に伝達される各パラメータを取得する.
argmentsオブジェクトは配列と似ているだけで、Arayの例ではない.各パラメータ(例えば、最初のパラメータはargments[0]であり、2番目のパラメータはargments[1]である.)には、length属性を用いて転送入力のパラメータの個数を決定する.
また、JavaScriptでは、解析器はネーミングパラメータを検証しません.argmentsオブジェクトのlength属性にアクセスして、どれぐらいのパラメータがあるかを知ることができます.その後、呼び出し時にパラメータの個数を入力します.
特に、argmentsの値は、対応するネーミングパラメータの値と常に一致している.
最後の点は、伝達値がないパラメータが自動的にundefined値に与えられます.例えば、doSum()関数に一つのパラメータを渡すだけで、num 2にundefined値が保存されます.
JavaScriptの中のすべてのパラメータは値で伝達されています.引用によってパラメータを伝達することは不可能です.
再読み込み
JavaScriptの関数は署名されていないので、Javaのようなリロードはできません.
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"); //
}
関数に対する厳格なモードの制限:パラメータ
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()関数が呼び出されます.