JAvascript:関数に渡される隠しパラメータ:arguments

2167 ワード

よく知られているように、jsはスクリプト言語であり、スクリプト言語の特徴の一つは極めて柔軟である.時々「柔軟」でc系の主流言語に慣れている人は、スクリプトの強さに感心せざるを得ない.たとえば、ここで説明するargumentsパラメータです.本人が初めてこれを見たとき、「変相」の普通のパラメータだと思っていたが、関数を定義するときに明確に宣言する必要はなかった.しかし、コードは安価です(Code is cheap.)コードを見てください.
function funcTest(a, b) {
     alert(a);
     alert(b);
     for (var i = 0; i < arguments.length; i++) {
         alert(arguments[i]);
     }
 }
 
function test() {
     funcTest(1, 2, 3); //   html     
 }

 
コードが実行されたらどうですか.いいですね.ここのlengthは本当におかしいですね.「コード実行時には、1,2,1,2,3の順に表示されます.したがって、関数を定義する際には、パラメータリストを指定しなくてもargumentsで取得したパラメータを参照することができ、プログラミングに大きな柔軟性をもたらします」と説明しています.この文ほど透徹した解釈はない.ここで、argumentsパラメータはjs配列オブジェクトのインスタンスですか?次のコードがこの疑問点を解決します.
Array.prototype.testArg = "test arguments";
 function funcArg() {
     alert(arguments.testArg);
 }
 function test() {
     alert(new Array().testArg);
     funcArg();
 }

 
コードの実行結果は、「test arguments」と「undefined」が先にポップアップされます.なぜfuncArg呼び出しは「undefined」を返しますか?ここを見て、あなたの上の疑問が解消されたと信じています.ここまでargumentsのすべてを掌握したと思ってるの?それはあまりにもjsの天才的な設計者を軽視して、次はもう一つの才能のある設計を見ます:Q:再帰を使って1からnの自然数の和を計算します
A1:
function sum(n) {
     if (1 == n) return 1;
     else return n + sum(n - 1);
 }
 
function test() {
     alert(sum(100)); ; //   html     
 }

A2:
function sum(n) {
     if (1 == n) return 1;
     else return n + arguments.callee(n - 1);
 }
 
function test() {
     alert(sum(100)); ; //   html     
 }

A 1とA 2の2つの答えはいずれも問題を解決し、1つ目の方法は多くの人の一般的なやり方だと信じていますが、jsは2つ目の方法を推奨しています.原書ではA 1の方式について「関数内部にsum自身への呼び出しが含まれているが、JavaScriptでは関数名は変数名にすぎず、関数内部でsumを呼び出すのはグローバル変数を呼び出すことに相当し、呼び出し自身をうまく表現できない」とし、sumはsumを呼び出し、「呼び出し自身をうまく表現できない」と述べているが、なぜだろうか.本は使う時に恨みが少なくて、本を調べて、本の上でこのように書きます:“argumentsオブジェクトのもう一つの属性はcalleeで、それは関数オブジェクト自身に対する引用を表して、これは無名の関数の再帰あるいは関数のパッケージ性を保証するのに役立ちます”この話は私が言うのが理にかなっていることを認めて、私はこれまですべて本特に技術類の本に対して高度な信頼を維持して、しかし、ここで「argumentsオブジェクトのもう一つの属性はcallee」と言いますが、ここで「arguments」はどのように「オブジェクト」になりますか?タイトルは「関数に渡される隠しパラメータ:arguments」と言っていますが、本を写し間違えたのでしょうか.電子書籍を見て、コピーして貼り付けても間違いがありますか?オブジェクト?対象はなんと多いのか、次は「対象」を探します.