1. 引数とは JavaScript の組み込みオブジェクトです。これは奇妙で見過ごされがちですが、実際には非常に重要です。すべての主要な JavaScript ライブラリは、arguments オブジェクトを利用します。したがって、agruments オブジェクトは JavaScript プログラマにとって馴染みのあるものでなければなりません。
すべての関数には、関数によって呼び出されるパラメータを含む独自の引数オブジェクトがあります。 typeof 引数が使用されている場合は、「object」が返されます。ただし、データを呼び出すメソッドを使用して引数を呼び出すことはできます。たとえば、長さとインデックスのメソッドです。ただし、配列のプッシュおよびポップ オブジェクトは適用できません。
2. 柔軟な関数を作成する
引数オブジェクトは用途が非常に限られているように見えますが、実際には非常に便利なオブジェクトです。引数オブジェクトを使用すると、可変数の引数を使用して関数を呼び出すことができます。 Dean Edwards の Base2 ライブラリには、この柔軟性を示すフォーマット関数があります。
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]; }); };
format(“And the %1 want to know whose %2 you %3″, ”papers”, ”shirt”, ”wear”);
3. 引数オブジェクトを実際の配列に変換します。
引数オブジェクトは実際の JavaScript 配列ではありませんが、それでも可能です。それを簡単に標準データに変換し、配列操作を実行します。
それから、関数
Arguments オブジェクトをすべて含む関数のパラメータが含まれます。引数オブジェクトを使用すると、すべてのタイプの JavaScript メソッドを実行できます。ここに makeFunc 関数の定義を添付すると、関数の参照とその関数のすべてのパラメータを指定できます。指定する。匿名関数呼び出しに付随するパラメータを提供します。
var args = Array.prototype.slice.call(arguments);
最初の引数オブジェクトは、呼び出したい関数への参照を提供し、引数配列から削除され、指定された関数を返します。
最初に適用された引数は関数呼び出しのスコープを指し、最初は null として保持され、makeFunc は元の配列値を引数に連結します。
テンプレートを参照するたびに呼び出す必要がないように、テンプレートを同じ位置に出力する必要があります。一般的な関数を使用できます。 makeFunc を使用して、format を呼び出してテンプレートを自動的に完成させる関数を返します。
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))); }; }
次のように、majorTom 関数を呼び出すことができます。
var majorTom = makeFunc(format, ”This is Major Tom to ground control. I'm %1.”);
これは素晴らしいと思われるかもしれませんが、引数には他にも驚くべき機能があります: callee メソッドには参照が含まれています。では、それをどのように使用するのでしょうか? Arguments.callee メソッドを使用すると、匿名関数がそれ自体を簡単に指すことができます。
Repeat は、関数参照と 2 つの数値を運ぶ関数です。最初の数値は関数が呼び出される回数で、2 番目の数値は各呼び出し間の時間 (ミリ秒単位) です。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.”
function repeat(fn, times, delay) { return function() { if(times– > 0) { fn.apply(null, arguments); var args = Array.prototype.slice.call(arguments); var self = arguments.callee; setTimeout(function(){self.apply(null,args)}, delay); } }; }