2015-12-25 6 views
5

私はJavaScriptの本を読んでいましたが、プロトタイプでJavaScript配列の配列機能を拡張する方法を読んでいましたが、この例ではわかりませんでしたが、それについて深い説明はなく、Iamはできませんargumentsプロパティはthis.some_function.argumentsからアクセスできますか?実際に私は説明できませんか?

ここで私は、引数にアクセスすることができましたが、私はこれが働いているのか分からない
Array.prototype.some_function = function(){ 
    var args = this.some_function.arguments;     // 1 
    var args_length = this.some_function.arguments.length;  // 2 
    ... 
} // some_function 

が、これは我々が(この文脈では配列)は、このメソッドを呼び出すされているオブジェクトを参照してください意味:ということを理解すること、some_functionはそのオブジェクトのプロパティを参照し、実装している関数を意味しますが、引き数はその関数の静的プロパティではありません。 IAMは他の人にこれを使用できません例: -

this.some_other_function.arguments // gives error 
+2

は、あなたが質問この回答https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/argumentsをしない、次のコメントが有益である:?「の場合すなわち、関数fが呼び出しスタック上に何度か現れた場合、f.argumentsの値は関数の最新の呼び出しに対応する引数を表します。 –

答えて

4

これはJavaScriptの非推奨機能のようです。

非推奨

この機能はWeb標準から削除されました:言うMDN: Function.arguments上のドキュメントを参照してください。一部のブラウザでもまだ がサポートされていますが、削除中です。 古いプロジェクトや新しいプロジェクトでは使用しないでください。それを使用しているページやWebアプリケーションはいつでも破損する可能性があります( )。

予期しない動作です。それが非難される理由かもしれません。あなたが言ったように、関数は静的オブジェクトなので、どのように動的にすることができますarguments?まあ、私は明白なもの以外の説明はないと思います:JavaScriptエンジンは、各呼び出しの前に関数にargumentsの値を割り当てます。

ところで、同じことを示しているシンプルなコードがある:

function f() { return f.arguments; } 
f(8);     // returns [8] 
f(8, 9);    // returns [8, 9] 
f.arguments === null // true 

ソリューションがあり、当然のことながら、arguments代わりfunc.argumentsのローカル変数を使用するには、MDN: argumentsを参照してください。

1

引数objectは、すべての関数でローカル変数として使用できます。
関数内でargumentsオブジェクトを使用することはできますが、instance.argumentsによってそれらにアクセスすることはできません。
function.argumentsによる引数へのアクセスは、javascriptで提供されている奇妙な機能で、現在は非推奨です。
function.argumentsを実行すると、スタック内で現在実行されている関数のarguments変数が与えられます。

var someContructor = function() { 
 
    console.log('someContructors arguments'); 
 
    console.log(arguments); 
 

 

 
    //SomeConstructor is currently in stack executing 
 
    //accessing its arguments by function.arguments 
 
    console.log('someContructors arguments accesed using function.arguments'); 
 
    console.log(someContructor.arguments); 
 
}; 
 

 
someContructor.prototype.method = function() { 
 
    console.log('method arguments'); 
 
    console.log(arguments); 
 
    //method is in stack executing 
 
    //accessing its arguments by function.arguments 
 
    console.log('method arguments accesed using function.arguments'); 
 

 
    console.log(this.method.arguments); 
 

 
}; 
 
var newObject = new someContructor(1, 2); 
 
newObject.method(1, 2, 12, 23, 23, 232, 3);

1

より明確にするため..私のコードを通過し、コンソールを読むようにしてくださいメインコンセプトは「すべては単なるオブジェクトである」ので、配列が、プロトタイプを持つオブジェクトであるJavaScriptの、コンストラクタなどがあります。メソッドが定義されて

function Add(a,b) 
{ 
    console.log(this.arguments) // logs an array-like of [a,b] 
    return a+b; 
} 

どれ関数はオブジェクトのプロパティは法と呼ばれているとして宣言され、引数は元のための関数内渡すパラメータですか?プロトタイプスコープ内のみ。つまり、メソッド自体またはそのコンストラクターをその他のスコープに渡さない限り、メソッドのプロパティelseにはアクセスできません。

JavaScriptと呼ばれる本をcody lindleyによって簡潔に参照することができます。thisにはJavaScriptに関する高度な知識が必要です。 MDN

この機能を1として

はWeb標準から削除されました。一部のブラウザでもまだ がサポートされていますが、削除中です。 古いプロジェクトや新しいプロジェクトでは使用しないでください。それを使用しているページやWebアプリケーションはいつでも破損する可能性があります( )。

関連する問題