上記の概念について説明する前に、まず JavaScript の関数の暗黙的なパラメーターについて説明します。 引数
引数
このオブジェクトは、実行される関数とそれを呼び出す関数のパラメーターを表します。
[関数.]引数[n]
パラメータ機能: オプション。現在実行中の Function オブジェクトの名前。 n: オプション。 Function オブジェクトに渡されるパラメーター値の 0 から始まるインデックス。
説明
Arguments は、関数呼び出し時に指定されたパラメータに加えて作成される非表示オブジェクトです。 Arguments は配列に似ていますが、配列ではないオブジェクトです。配列と同じアクセス プロパティとメソッドを持ち、対応する単一パラメーターの値に argument[ を通じてアクセスできるためです。 n] であり、配列長属性 length を持ちます。また、arguments オブジェクトには関数宣言で定義されたパラメータリストに限らず、実際に関数に渡されるパラメータが格納されており、明示的に作成することはできません。引数オブジェクトは関数の先頭でのみ使用できます。次の例では、これらのプロパティの詳細を示します。
//引数オブジェクトの使用法。
関数 ArgTest(a, b){
var i, s = "ArgTest 関数が必要です ";
var numargs = argument.length; // 渡された引数の値を取得します。
var expargs = ArgTest.length; // 期待されるパラメータの値を取得します。
if (expargs < 2)
s += expargs + " 引数。 ";
それ以外
s += expargs + " 引数。 ";
if (numargs < 2)
s += numargs + " が渡されました。";
それ以外
s += numargs + "合格しました。";
s += "nn"
for (i =0; i < numargs; i++){ // パラメータの内容を取得します。
s += " Arg " + i + " = " + argument[i] + "n";
}
return(s); // パラメータリストを返します。
、
引数が配列 (Array クラス) ではないことを示すコードを追加しました。
Array.prototype.selfvalue = 1;
アラート(新しい配列().selfvalue);
関数 testAguments(){
アラート(引数.selfvalue);
を
実行すると、最初のアラートに 1 が表示されることがわかります。これは、配列オブジェクトの selfvalue 属性の値が 1 であることを意味します。関数 testAguments を呼び出すと、「未定義」が表示され、次のことを示します。これは引数の属性ではありません。つまり、引数は配列オブジェクトではありません。
発信者
現在の関数を呼び出した関数への参照を返します。
関数名.caller
functionName オブジェクトは、実行される関数の名前です。
関数の場合、caller 属性は関数の実行時にのみ定義されることに注意してください。関数がトップレベルから呼び出された場合、caller には null が含まれます。 caller 属性が文字列コンテキストで使用される場合、結果は functionName.toString と同じになります。つまり、関数の逆コンパイルされたテキストが表示されます。
次の例は、caller 属性の使用法を示しています。
// caller Demon {
関数 callerDemo() {
if (callerDemo.caller) {
var a= callerDemo.caller.toString();
アラート(a);
} それ以外 {
alert("これは最上位の関数です");
}
}
関数 handleCaller() {
callerDemo();
呼び出し
先は
、指定された Function オブジェクトの本体である実行中の Function オブジェクトを返します。
[関数.]引数.呼び出し先
オプションの function パラメーターは、現在実行されている Function オブジェクトの名前です。
callee 属性の初期値は、実行中の Function オブジェクトであること
に注意してください
。callee 属性は、arguments オブジェクトのメンバーであり、関数オブジェクト自体への参照を表します。これは、匿名関数の再帰や関数のカプセル化を保証するのに役立ちます。たとえば、次の例では、自然関数の合計を再帰的に計算します。 1からnまでの数字。このプロパティは、関連する関数が実行されている場合にのみ使用できます。また、呼び出し先には長さ属性があり、検証にはこの方が適している場合があることにも注意してください。 argument.length は実際のパラメータの長さ、arguments.callee.length は仮パラメータの長さです。これにより、呼び出し中の仮パラメータの長さが実際のパラメータの長さと一致しているかどうかを判断できます。
例
//呼び出し先は自分自身を出力できます
関数 calleeDemo() {
アラート(引数.呼び出し先);
}
//パラメータの検証に使用されます
関数 calleeLengthDemo(arg1, arg2) {
if (arguments.length==arguments.callee.length) {
window.alert("仮パラメータと実際のパラメータの長さが正しいことを確認してください!");
戻る;
} それ以外 {
alert("実際のパラメータの長さ: " +arguments.length);
alert("正式なパラメータの長さ: " +arguments.callee.length);
}
}
//再帰計算
var sum = function(n){
if (n <= 0)
1を返します。
それ以外
n + 引数を返します。callee(n - 1)
}
より一般的な再帰関数:
var sum = function(n){
if (1==n) は 1 を返します。
場合は
n + sum (n-1) を返します。
関数には sum 自体への参照が含まれています。関数名は単なる変数名です。この場合、関数内で sum を呼び出すことは、それ自体を呼び出すことと同じです。良いアプローチ。
apply と call
(thisArg,argArray);
call(thisArg[,arg1,arg2...] ])
のような違いがあります。
;
つまり、すべての関数内の this ポインターには thisArg の値が割り当てられ、
argArray が有効な配列でない場合、または引数でない場合に
関数を別のオブジェクトのメソッドとして実行するという目的
を達成できます。オブジェクトの場合、TypeError が発生します。
argArray も thisArg も指定されていない場合は、Global オブジェクトが thisArg として使用されます。
また、パラメータを渡すことはできません。
call の説明
call メソッドは、関数のオブジェクト コンテキストを初期コンテキストから thisArg で指定された新しいオブジェクトに変更します。
thisArg パラメーターが指定されていない場合は、Global オブジェクトが thisArg として使用されます。
関連ヒント:
call と apply を使用して別の関数 (クラス) を適用した後、現在の関数 (クラス)のメソッドやプロパティを「継承」と呼ぶこともできます。次の例を見てください:
// 継承のデモンストレーション
関数base() {
this.member = "dnnsun_Member";
this.method = function() {
window.alert(this.member);
}
}
関数 extend() {
Base.call(this);
window.alert(メンバー);
window.alert(this.method);
上記の例からわかるように、extend は呼び出し後に Base のメソッドとプロパティを継承できます
。
ちなみに、JavaScript フレームワークのプロトタイプでは apply を使用してクラスを定義するパターンを作成しています
。
実装コードは次のとおりです。
作成: function() {
戻り関数() {
this.initialize.apply(this, 引数);
}
}
}
分析: コードの観点から見ると、このオブジェクトにはメソッド Create が 1 つだけ含まれています。これは関数、つまりクラスを返します。ただし、これは、initialize を呼び出すクラスのコンストラクターでもあり、このメソッドはクラスの作成時に定義される初期化関数です。このようにして、
クラス作成モードの例は、プロトタイプで実装できます
。
var vehicle=Class.create();
車両.プロトタイプ={
初期化:関数(タイプ){
this.type=タイプ;
}
showSelf:function(){
alert("この車両は" + this.type);
}
var
moto=新しい車両("Moto");
moto.showSelf();
プロトタイプの詳細については、公式Webサイトをご覧ください。
http://www.cnblogs.com/sunwangji/archive/2006/08/21/482341.html