javascript Agmentsオブジェクト——関数の実際のパラメータ
2694 ワード
javascript関数の中で、識別子argmentsは特別な意味を持っています.オブジェクトを呼び出す特殊な属性で、Agmentsオブジェクトを参照します.Argementsオブジェクトは配列のようですが、ここでは像だけが哈ではないことに注意してください.javascript関数の体内では、argmentsは配列のように、length属性があり、関数に伝えるパラメータの個数を表すことができます.一つの形式パラメータを参照すると、パラメータ名を使用しても良いし、argments[]配列形式を使用しても良いし、ここでargments[0]は最初のパラメータを表しています.だから、javascriptの中でAgmentsオブジェクトは関数の実際のパラメータです.次に、私達は一緒にこの不思議な国に入ります.
行列に変換:
一般的には配列に変換する必要はありませんが、パラメータを配列として扱う場合は配列関数が必要です.この場合はパラメータオブジェクトを行列に変換する必要があります.
argments.length属性:
jsは積極的にあなたのためにどれぐらいのパラメータを関数に伝えたかを判断しません.もしあなたがマルチパスしたら、余分な部分は使われません.もしあなたが少なくパスしたら、伝えていないパラメータ値はundefinedです.だから、私達はargmentsのlength属性を使って、関数を呼び出す時に正しい数の実際のパラメータを使ったかどうかを検査します.javascriptはあなたのためにこんなことをしないからです.
argmentsのcalee属性は、現在実行中の関数を参照するために使用されます.これは、名前のない関数呼び出し自体にとって非常に有利です.前のページで関数の直接量で定義した関数で再帰関数を実現したことを覚えていますか?その中で、関数の直接量を関数名として説明します.このように再帰を実現することは、自分を呼び出すのに便利です.今はargmentsのこのcaleeで簡単に実現できます.
行列に変換:
一般的には配列に変換する必要はありませんが、パラメータを配列として扱う場合は配列関数が必要です.この場合はパラメータオブジェクトを行列に変換する必要があります.
var args = Array.prototype.slice.call( arguments, 0 );
var args = [].splice.call( arguments, 0 );
// , ,
var proxy = function() {
var funcName = arguments[ 0 ];
// Convert arguments to an array.
var args = Array.prototype.slice.call( arguments, 0 );
// Remove funcName from the arguments list
args.splice( 0, 1 );
funcName(args);
};
argments.length属性:
jsは積極的にあなたのためにどれぐらいのパラメータを関数に伝えたかを判断しません.もしあなたがマルチパスしたら、余分な部分は使われません.もしあなたが少なくパスしたら、伝えていないパラメータ値はundefinedです.だから、私達はargmentsのlength属性を使って、関数を呼び出す時に正しい数の実際のパラメータを使ったかどうかを検査します.javascriptはあなたのためにこんなことをしないからです.
function f(x,y,z)
{
//
if(arguments.length != 3)
{
throw new Error("function f called with " + arguments.length + "arguments ,but it not 3 arguments.");
}
//
}
argmentsはまた、関数のために任意の数の実際のパラメーターを送ることができます.例えば、あなたが私に送った数字の大きさを判断したいです.一番大きなサイズを取り出してください.そうです.どのぐらいのパラメーターを送ってもいいです.しかし、前提はあなたが数字を送ることです.関数の内部で判断するのがおっくうです.はあfunction max()
{
// , JavaScript
var m = Number.NEGATIVE_INFINITY;
for(var i = 0; i < arguments.length; i++)
{
// m , m
if(arguments[i] > m)
m = arguments[i];
}
return m;
}
どうですか?この方法は巧妙ですよね?へへ例えば、あなたが関数にparamというパラメータを伝えました.そして、このパラメータだけがあれば、paramとargments[0]はこのパラメータ値に対する参照であり、その中の一つの値を変えました.即ち、二つの値を変えました.function change(param)
{
// param simaopig, alert simaopig,
// alert undefined
alert(param);
// arguments[0]
arguments[0] = 'xiaoxiaozi';
// , xiaoxiaozi
alert(param);
}
argmentsのcalee属性:argmentsのcalee属性は、現在実行中の関数を参照するために使用されます.これは、名前のない関数呼び出し自体にとって非常に有利です.前のページで関数の直接量で定義した関数で再帰関数を実現したことを覚えていますか?その中で、関数の直接量を関数名として説明します.このように再帰を実現することは、自分を呼び出すのに便利です.今はargmentsのこのcaleeで簡単に実現できます.
// , arguments.callee
var result = function(x){
if(x<=1) return 1;
return x*arguments.callee(x-1);
};
最後にみなさんに注意したいのですが、このargmentsがこんなに強い以上、変数の名前はargmentsにしないでください.実はargmentsはjavascriptの保留文字の一つです.うん.