2013-02-10 26 views
5

Rozumiem, że mogę wywołać Array.prototype.slice.call(arguments, 1), aby zwrócić ogon tablicy.JavaScript "argumenty" Słowo kluczowe

Dlaczego ten kod nie zwróci [2,3,4,5]?

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

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

Odpowiedz

9

bo jesteś tylko przechodząc jeden argumentów — tablicy.

Spróbuj alert(foo(1,2,3,4,5));

Argumenty są numerowane od 0 w JavaScript, więc po uruchomieniu plasterek na 1 i przekazać 1 argumentu, można dostać nic.

Należy zauważyć, że może to utrudnić optymalizację, aby obiekt "arguments" mógł "wyciec" z funkcji. Ze względu na aliasing pomiędzy arguments a parametrami formalnymi optymalizator nie może wykonać żadnej statycznej analizy funkcji, jeśli obiekt arguments zostanie wysłany gdzie indziej, ponieważ nie ma pojęcia, co może się stać ze zmiennymi parametrów.

+0

Czy lepiej byłoby skopiować argumenty? 'funkcja foo() { \t var args = argumenty; \t return Array.prototype.slice.call (args, 1); } ' – Eric

+1

Artykuł MDN ze słowa kluczowego' arguments' opisuje opisany problem optymalizacji: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments – Eric

3

Ponieważ arguments to {0: [1,2,3,4,5], length: 1}, który jest obiektem tablicowym z jednym elementem. Ogon tablicy z jednym elementem jest pustą tablicą.

czy zmiany definicji funkcji:

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

lub przejść w:

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

arguments Przedmiotem Tablica jak to wymieniono argumenty i kilka innych właściwości (np jako odniesienie do bieżącej funkcji w arguments.callee).

W tym przypadku Twój obiekt arguments wygląda następująco:

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

Myślę, że to wyjaśnia zachowanie jesteś widząc całkiem dobrze. Spróbuj usunąć nawiasy tablicowe w wywołaniu funkcji lub użyj arguments[0], aby uzyskać dostęp do arry.