2013-02-10 9 views
5

私はArray.prototype.slice.call(arguments, 1)と呼んで、配列の末尾を返すことができます。Javascript 'arguments'キーワード

なぜこのコードでは[2,3,4,5]が返されませんか?

function foo() { 
    return Array.prototype.slice.call(arguments,1); 
} 

alert(foo([1,2,3,4,5])); 

答えて

9

だけ引数—配列を渡しているので。

てみalert(foo(1,2,3,4,5));

引数は、JavaScriptで0から番号なので、あなたが1であなたのスライスを開始し、1つの引数を渡すとき、あなたは何を取得しています。

argumentsオブジェクトが機能から「リーク」できるように最適化を妨げる可能性があることに注意してください。 argumentsと仮パラメータの間のエイリアシングのため、argumentsオブジェクトがどこか別の場所に送信された場合、オプティマイザは関数の静的解析を実際に行うことができません。

+0

引数をコピーする方が良いでしょうか? '関数foo(){ \t var args =引数; \t戻り値Array.prototype.slice.call(args、1); } ' – Eric

+1

' arguments'キーワードのMDN記事は、あなたが言及したこの最適化問題を記述しています:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments – Eric

3

arguments{0: [1,2,3,4,5], length: 1}であり、1つの要素を持つ配列のようなオブジェクトです。 1つの要素を持つ配列の末尾が空の配列です。

いずれ関数の定義変更:

function foo(arr) { 
    return Array.prototype.slice.call(arr,1); 
} 

を有するか、関数を呼び出す:(

foo(1,2,3,4,5); 
10

arguments引数およびその他のいくつかのプロパティを示し、アレイ状の物体であるよう現在の関数への参照としてarguments.callee)。この場合

、あなたのargumentsオブジェクトは、次のようになります。

arguments { 
    0: [1,2,3,4,5], 
    length: 1, 
    other properties here 
} 

私は、これはあなたが非常によく見ている動作を説明してだと思います。関数呼び出しで配列括弧を削除するか、arguments[0]を使用してarryにアクセスしてください。

関連する問題