javascriptはパラメータを理解します.
2896 ワード
javaScript高級プログラム設計(第三版)から抜粋:
ECMAScript関数のパラメータはほとんどの他の言語の関数のパラメータとは異なります.ECMAScript関数は、どれぐらいのパラメータを伝達してもかまいません.また、伝達パラメータはどのようなデータタイプですか?
ECMAScriptのパラメータは内部では一つの配列で表されています.関数が受信したのは常にこの配列であり、配列にどのパラメータが含まれているかに関心がない.実際には、このパラメータ配列は関数の体内でargmentsオブジェクトによってアクセスでき、関数に伝達される各関数を取得することができる.
実は、argmentsオブジェクトは配列と似ているだけで、四角い括弧文法を使用して各要素にアクセスできます.すなわち、最初の要素はargments[0]で、第二の要素はargments[1]です.伝達されたパラメータの個数は、argments.length法によって決定することができる.
例えば、以下の2つの関数の定義は等価である.
function sayHi(){
alert(「hello」+argments[0]+argments[1]);
)
function sayHi(name,message){
alert(「hello」+name+message);
)
これらはECMAScriptの特徴を説明しています.ネーミングのパラメータは便利だけを提供していますが、必要ではありません.
argmentsオブジェクトのlength属性にアクセスすることによって、どれぐらいのパラメータが関数に伝達されているかを知ることができます.
厳密なモードでは、関数が一つのパラメータだけに伝達されると、アーグメンント[1]に10を割り当てても、num 2の値は依然としてUdefinedである.なお、argmentsの値を書き換えると文法的にエラーが発生します.つまり、コードも実行されません.
個人的な理解:argmentsオブジェクトは、アクセス伝達関数のパラメータを提供するだけで便利です.パラメータを提供することはできません.
ECMAScript関数のパラメータはほとんどの他の言語の関数のパラメータとは異なります.ECMAScript関数は、どれぐらいのパラメータを伝達してもかまいません.また、伝達パラメータはどのようなデータタイプですか?
ECMAScriptのパラメータは内部では一つの配列で表されています.関数が受信したのは常にこの配列であり、配列にどのパラメータが含まれているかに関心がない.実際には、このパラメータ配列は関数の体内でargmentsオブジェクトによってアクセスでき、関数に伝達される各関数を取得することができる.
実は、argmentsオブジェクトは配列と似ているだけで、四角い括弧文法を使用して各要素にアクセスできます.すなわち、最初の要素はargments[0]で、第二の要素はargments[1]です.伝達されたパラメータの個数は、argments.length法によって決定することができる.
例えば、以下の2つの関数の定義は等価である.
function sayHi(){
alert(「hello」+argments[0]+argments[1]);
)
function sayHi(name,message){
alert(「hello」+name+message);
)
これらはECMAScriptの特徴を説明しています.ネーミングのパラメータは便利だけを提供していますが、必要ではありません.
argmentsオブジェクトのlength属性にアクセスすることによって、どれぐらいのパラメータが関数に伝達されているかを知ることができます.
<html>
<head>
<script type="text/javascript">
function howmanyargs(){
alert(arguments.length);
}
function test(){
howmanyargs();//0
howmanyargs(1);//1
howmanyargs(1,2);//2
}
</script>
</head>
<body>
<button onclick="test();">hhhh</button>
</body>
</html>
は、この例によって、関数に異なる数のパラメータを受け入れることによって、異なる機能を実現することができる.<html>
<head>
<script type="text/javascript">
function getSum(){
if(arguments.length==1){
return arguments[0];
}
else if(arguments.length==2){
return arguments[0]+arguments[1];
}
}
function test(){
alert(getSum(10));//10
alert(getSum(20,20));//20
}
</script>
</head>
<body>
<button onclick="test();">hhhh</button>
</body>
</html>
一方、argmentsオブジェクトは、命名パラメータとともに使用することができる.また、argmentsオブジェクトの値は、ネーミングパラメータに対応する値と常に同期されます.<html>
<head>
<script type="text/javascript">
function getSum(num1,num2){
if(arguments.length==1){
return arguments[0];
}
else if(arguments.length==2){
return arguments[0]+num2;
}
}
function test(){
alert(getSum(10));//10
alert(getSum(20,30));//50
}
</script>
</head>
<body>
<button onclick="test();">hhhh</button>
</body>
</html>
つまり、argmentsオブジェクトによって着信パラメータの値が変更されると、ネーミングパラメータの値も変更される.<html>
<head>
<script type="text/javascript">
function getChange(num1,num2){
arguments[1]=num2+10;
alert(num2);
}
function test(){
getChange(1,10);//20
}
</script>
</head>
<body>
<button onclick="test();">hhhh</button>
</body>
</html>
上記の例では、argments[0]とnum 1、argments[1]とnum 2の値は同期されている.二つの値を読むと同じメモリ空間にアクセスするということですか?ただ、彼らの値は同期します.最後に、伝達値がないネーミングパラメータの値はUnidefinedとなります.厳密なモードでは、関数が一つのパラメータだけに伝達されると、アーグメンント[1]に10を割り当てても、num 2の値は依然としてUdefinedである.なお、argmentsの値を書き換えると文法的にエラーが発生します.つまり、コードも実行されません.
個人的な理解:argmentsオブジェクトは、アクセス伝達関数のパラメータを提供するだけで便利です.パラメータを提供することはできません.