引数:JavaScriptの奇妙さ

Joseph Gordon-Levitt
リリース: 2025-03-08 00:23:12
オリジナル
610 人が閲覧しました

arguments: A JavaScript Oddity

引数:JavaScriptの奇妙さ

キーテイクアウト

  • 引数は、すべてのJavaScript関数内で利用可能なローカルな配列のようなオブジェクトであり、関数が呼び出されたときに提供されたすべての引数を含みます。プッシュやポップなどの標準配列メソッドを持っていないため、真の配列ではありません。
  • その制限にもかかわらず、「引数」は強力なツールであり、さまざまな数の引数を受け入れる柔軟な関数の作成を可能にします。
  • 引数には、「引数」オブジェクトを作成した関数への参照を含む「Callee」プロパティもあり、匿名の関数がそれ自体を参照できるようにします。これは、プリセットの引数を使用して自己参照関数と関数を作成するために使用できます。
  • 引数は、すべての関数内で利用可能なローカルの配列のようなオブジェクトの名前です。それは風変わりで、しばしば無視されますが、多くのプログラミングの魔法の源です。すべての主要なJavaScriptライブラリは、引数オブジェクトの力を活用します。それはすべてのJavaScriptプログラマーが慣れてくれるべきものです
関数内では、変数:引数を介してアクセスできます。また、呼び出されたときに関数に提供されたすべての引数の配列が含まれています。実際にはJavaScriptアレイではありません。 typeof引数は、値「オブジェクト」を返します。配列インデックスを介して個々の引数値にアクセスでき、他の配列のような長さのプロパティがありますが、プッシュやポップなどの標準配列メソッドはありません。

柔軟な関数を作成

それは限られているように見えるかもしれませんが、議論は非常に有用なオブジェクトです。たとえば、さまざまな数の引数を受け入れる機能を作成できます。 Dean EdwardsによってBase2ライブラリにある形式関数は、この柔軟性を示しています:

テンプレート文字列を提供します。この文字列では、%1〜%9を使用して値に場所ホルダーを追加し、挿入する文字列を表す最大9つの他の引数を提供します。たとえば、

function format(string) {
  var args = arguments;
  var pattern = new RegExp("%([1-" + arguments.length + "])", "g");
  return String(string).replace(pattern, function(match, index) {
    return args[index];
  });
};
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
上記のコードは文字列を返します。

気づいたかもしれないことの1つは、形式の関数定義では、1つの引数のみを指定したことです:文字列。 JavaScriptを使用すると、関数定義に関係なく、任意の数の引数を関数に渡すことができ、引数オブジェクトはすべてにアクセスできます。

実際の配列に変換します
format("And the %1 want to know whose %2 you %3", "papers", "shirt", "wear");
ログイン後にコピー
ログイン後にコピー

引数は実際のJavaScriptアレイではありませんが、標準配列メソッドを使用して簡単に1つに変換できます。

変数ARGSには、引数オブジェクトからのすべての値を含む適切なJavaScriptアレイオブジェクトが含まれます。

プリセット引数を使用して関数を作成します

引数オブジェクトにより、あらゆる種類のJavaScriptトリックを実行できます。 MakeFunc関数の定義は次のとおりです。この関数を使用すると、関数参照とその関数の任意の数の引数を提供できます。指定した関数を呼び出す匿名関数を返し、匿名関数が呼び出されたときに提供された新しい引数と一緒にプリセット引数を提供します。

function format(string) {
  var args = arguments;
  var pattern = new RegExp("%([1-" + arguments.length + "])", "g");
  return String(string).replace(pattern, function(match, index) {
    return args[index];
  });
};
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー
MakeFuncに提供された最初の引数は、呼び出す関数への参照と見なされます(はい、この簡単な例ではエラーがチェックされません)、引数配列から削除されます。 MakeFuncは、関数オブジェクトの適用方法を使用して指定された関数を呼び出す匿名関数を返します。

最初のApplyの引数は、関数が呼び出されるスコープを指します。基本的に、これが呼び出される関数内で言及するキーワード。今のところ少し前進しているので、nullを維持します。 2番目の引数は、関数の引数オブ​​ジェクトに変換される値の配列です。 MakeFuncは、匿名関数に提供された引数の配列に元の値の配列を連結し、これを呼び出された関数に提供します。

テンプレートが常に同じである場所で出力するために必要なメッセージがあったとしましょう。フォーマット関数を呼び出すたびに常にテンプレートを引用する必要がないようにするために、makefuncユーティリティ関数を使用して、フォーマットを呼び出してテンプレート引数を自動的に入力する関数を返すことができます:

このように繰り返しmajortom関数を呼び出すことができます:

format("And the %1 want to know whose %2 you %3", "papers", "shirt", "wear");
ログイン後にコピー
ログイン後にコピー

Majortom関数を呼び出すたびに、最初の引数でフォーマット関数を呼び出します。テンプレートはすでに記入されています。

var args = Array.prototype.slice.call(arguments);
ログイン後にコピー
自己参照関数を作成

それはかなりクールだと思うかもしれませんが、待ってください、議論にはもう一つの驚きがあります。別の有用なプロパティがあります:Callee。 arguments.calleeには、引数オブジェクトを作成した関数への参照が含まれています。どうすればそのようなものを使用できますか? arguments.calleeは、匿名関数がそれ自体を参照できる便利な方法です。
function makeFunc() {
  var args = Array.prototype.slice.call(arguments);
  var func = args.shift();
  return function() {
    return func.apply(null, args.concat(Array.prototype.slice.call(arguments)));
  };
}
ログイン後にコピー

ただし、その関数の特別なバージョンを作成し、毎回2秒の遅延で3回繰り返されます。繰り返し機能を使用すると、これを行うことができます:
var majorTom = makeFunc(format, "This is Major Tom to ground control. I'm %1.");
ログイン後にコピー
majorTom("stepping through the door");
majorTom("floating in a most peculiar way");
ログイン後にコピー
"This is Major Tom to ground control. I'm stepping through the door."
"This is Major Tom to ground control. I'm floating in a most peculiar way."
ログイン後にコピー
何かを呼び出す結果は、各アラートの間に2秒の遅延を3回繰り返したアラートボックスです。
function format(string) {
  var args = arguments;
  var pattern = new RegExp("%([1-" + arguments.length + "])", "g");
  return String(string).replace(pattern, function(match, index) {
    return args[index];
  });
};
ログイン後にコピー
ログイン後にコピー
ログイン後にコピー

javascript引数についてよく尋ねる質問

javascriptの「引数」オブジェクトは何ですか?

「引数」オブジェクトは、JavaScriptのすべての非矢印関数内で利用可能なローカル変数です。これには、関数に渡されたすべての引数があるアレイのような構造が含まれています。このオブジェクトは、関数がさまざまな数の引数を処理する必要がある場合に役立ちます。 「引数」オブジェクトは実際の配列ではありませんが、必要に応じて1つに変換できることに注意することが重要です。

「引数」オブジェクトを配列に変換するにはどうすればよいですか?

アレイのように動作しますが、アレイプロトタイプから継承することはできません。ただし、array.from()メソッドまたはスプレッド演算子(…)を使用して、それを配列に変換できます。例は次のとおりです。

function convertargstoarray(){
var argsarray = array.from(arguments);
//または
var argsarray = [... arguments];
}}

「Arguments」の「Arguments」

関数checkargstype(){

for(var i = 0; i console.log(typeof arguments [i]);}

}

}

javaScriptのデフォルトパラメーターを使用して「引数」オブジェクトを使用できますか?デフォルトのパラメーターを持つ関数がパラメーターよりも少ない引数で呼び出された場合、「引数」オブジェクトは、デフォルト値ではなく、実際の引数のみを含む。

「引数」オブジェクトの「Callee」プロパティは何ですか?このプロパティは非推奨であり、新しいコードでは使用しないでください。代わりに、名前付き関数式または矢印関数を使用できます。

以上が引数:JavaScriptの奇妙さの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート