function aaa(sTemplate) { var args = arguments; var s = sTemplate; s = s.replace(/\%\%/g, "%"); for (var i = 1; i < args.length; i++) s = s.replace( new RegExp("\%" + i + "\%", "g"), args[i] ) return s;}
arguments は配列ではありませんが、添字は 0 から始まるため、
arguments[0] は受け取った最初のパラメーターを表します
arguments[1] は受け取った 2 番目のパラメーターを表します
。 ..
など...
このようにして、同じ関数を異なるパラメータで呼び出すことができます~
もちろん、関数がパラメータの処理方法を設定していることが前提です。そうでない場合は、 vain
arguments 属性
は、現在実行中の関数オブジェクトが引数オブジェクトを返します。
function.arguments
function パラメータは現在実行中の関数の名前であり、省略できます。
argument オブジェクトの length プロパティには、関数に渡される引数の数が含まれます。引数オブジェクトに含まれる単一パラメータのアクセス方法は、配列に含まれるパラメータのアクセス方法と同じです。
argument 属性の使用法を説明するために例を抜粋しました。以下を参照してください:
function ArgTest(){ var i, s, numargs = arguments.length; s = numargs; if (numargs < 2){ s += " argument was passed to ArgTest. It was "; }else{ s += " arguments were passed to ArgTest. They were " ; } for (i = 0; i < numargs; i++){ s += arguments[i] + " "; } return(s); }
Quote:
1. 引数の賢い使い方
Javascript 関数には、arguments という名前の配列のようなオブジェクトがあります。とても奇妙で知られていないように思えますが、数多くの Javascript ライブラリがその強力な機能を使用しています。したがって、その機能を利用するには、すべての JavaScript プログラマーがこの機能に精通している必要があります。
各関数には、現在の呼び出しのパラメーターを配列のような形式で保存する、arguments という名前の変数があります。また、実際には配列ではありません。typeof argument ステートメントを使用しようとすると、「object」(オブジェクト) が返されるため、Array のような Push や Pop などのメソッドは使用できません。それでも、添え字と長さ属性を使用してその値を取得できます。
2. 柔軟な関数を作成する
あまり知られていないようですが、引数は確かに非常に便利なオブジェクトです。たとえば、関数で可変数の引数を処理させることができます。 Dean Edwards によって作成された Base2 ライブラリには、この機能を最大限に活用する format という関数があります。
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]; }); };
replace の 2 番目のパラメータは関数にすることができ、関数の最初のパラメータは match にすることができます。テキストのパラメータはこれらの場所を順番に置き換えます。例:
format("そして、%1 は、あなたが %2 であることを知りたいと思っています", "papers", "shirt", "wear");
上記のスクリプトは
を返します。あなたが誰のシャツを着ているかを知るためです。」
ここで注意する必要があるのは、フォーマット関数の定義でも、string という名前のパラメータのみを定義していることです。 Javascript を使用すると、関数自体で定義されたパラメーターの数に関係なく、関数に任意の数のパラメーターを渡し、呼び出された関数の引数オブジェクトにこれらのパラメーター値を保存できます。
3. 実際の配列に変換します
引数オブジェクトは実際の Javascript 配列ではありませんが、次のコードのように、配列のスライス メソッドを使用して配列に変換できます
var args = Array.prototype .slice.call(arguments);
call(obj, 現在の関数で使用されるパラメータリスト)
call メソッドの最初のパラメータはオブジェクトであり、渡されたオブジェクトはスライス関数を呼び出します。引数は配列ではないため、スライスメソッドを直接呼び出すことはできません。このように、配列変数 args にはすべての引数オブジェクトに含まれる値が含まれます。
4. パラメーターで関数を構築します
引数オブジェクトを使用すると、記述する Javascript コードの量を減らすことができます。以下は、指定した関数名とその他の任意の数のパラメーターに基づいて匿名関数を返す makeFunc という関数です。この匿名関数が呼び出されると、元の呼び出しのパラメーターがマージされて、指定された関数に渡されて実行され、その戻り値が返されます。
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))); }; }
arguments には列挙不可能な属性 callee (for in では読み取れず、HasOwnProterty (名前) で判断可能) があり、arguments.callee は実行される Function オブジェクトです。現在の関数ポインターはスライス時にコピーされているため、args の最初の要素は関数の型です。makeFunc の最初のパラメーターは、呼び出される関数の名前を指定します (はい、この単純な例ではエラー チェックは行われません)。取得後の引数から。 makeFunc は、Function オブジェクトの apply メソッドを使用して指定された関数を呼び出す匿名関数を返します。
apply メソッドの最初のパラメーターはスコープを指定します。基本的に、スコープは呼び出される関数です。ただし、この例では少し複雑に見えるため、 null に設定します。2 番目のパラメーターは、呼び出す関数のパラメーターを指定する配列です。 makeFunc は、呼び出された関数に渡す前に、独自の引数を変換し、匿名関数の引数を連結します。
有种情况就是总是要有个输出的模板是相同的,为了节省每次是使用上面提到的 format 函数并指定重复的参数,我们可以使用 makeFunc 这个工具。它将返回一个匿名函数,并自动生成已经指定模板后的内容:
var majorTom = makeFunc(format, "This is Major Tom to ground control. I'm %1.");
你可以像这样重复指定 majorTom 函数:
majorTom("stepping through the door");
majorTom("floating in a most peculiar way");
那么当每次调用 majorTom 函数时,它都会使用第一个指定的参数填写已经指定的模板。例如上述的代码返回:
"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."
五、自引用的函数
您可能会认为这很酷,先别急着高兴,后面还有个更大的惊喜。它(arguments)还有个其他非常有用的属性:callee 。arguments.callee 包含了当前调用函数的被引用对象。那么我们如何使用这玩意做些的事情?arguments.callee 是个非常有用的调用自身的匿名函数。
下面有个名为 repeat 的函数,它的参数需要个函数引用和两个数字。第一个数字表示运行的次数,而第二个函数定义运行的间隔时间(毫秒为单位)。下面是相关的代码:
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); } }; }
repeat 函数使用 arguments.callee 获得当前引用,保存到 self 变量后,返回个匿名函数重新运行原本被调用的函数。最后使用 setTimeout 以及配合个匿名函数实现延迟执行。
作为个简单的说明,比如会在通常的脚本中,编写下面的提供个字符串并弹出个警告框的简单函数:
function comms(s) { alert(s); }
好了,后来我改变了我的想法。我想编写个“特殊版本”的函数,它会重复三次运行每次间隔两秒。那么使用我的 repeat 函数,就可以像这样做到:
var somethingWrong = repeat(comms, 3, 2000);
somethingWrong("Can you hear me, major tom?");
结果就犹如预期的那样,弹出了三次警告框每次延时两秒。
最后,arguments 即便不会经常被用到,甚至显得有些诡异,但是它上述的那些惊艳的功能(不仅仅是这些!)值得你去了解它。
undefined ≠ null
null是一个对象,undefined是一个属性、方法或变量。存在null是因为对象被定义。如果对象没有被定义,而测试它是否是null,但因为没有被定义,它无法测试到,而且会抛出错误。
if(myObject !== null && typeof(myObject) !== 'undefined') { //如果myObject是undefined,它不能测试是否为null,而且还会抛出错误 } if(typeof(myObject) !== 'undefined' && myObject !== null) { //处理myObject的代码 }