2013-03-26 17 views
6

W dalszej części, drugi i trzeci wyjścia konsoli wydają się sprzeczne:Nieoczekiwane „argumenty” własność na obiekcie

function test() { 

    console.log(arguments); // -> ["my", "arguments"] 

    console.dir(this); // -> test function with arguments property set to null 

    console.log(this.arguments); // -> ["my", "arguments"] 

} 

test.call(test, 'my', 'arguments'); 

Jak na moje komentarze, kontroli własnością arguments na this pokazuje null, podczas zalogowaniu this.arguments wyraźnie pokazuje ["my", "arguments"].

Czym dokładnie jest this, gdy wywołujesz funkcję w taki sposób? Nie oczekiwałem, że this.arguments będzie zawierać argumenty wywołania!

+1

Pamiętaj, że powielacie to samo, logując się do 'test.arguments'. –

Odpowiedz

5

MDN says

arguments jako własność Function nie może być dłużej używany.

Dlatego nie będę próbować używać this.arguments w ogóle, ale użyć zmiennej lokalnej funkcji arguments. Jest całkiem oczywiste, że jest trochę magii, aby stworzyć także arguments.

+0

Dzięki! To nie jest tak inteligentne, jak się wydawało. Deklaracja 'function test() {console.dir (test.arguments); } 'i wywołanie' test ('moje', 'argumenty'); 'pokazuje amortyzowaną właściwość funkcji bez pomieszania kontekstów :) – c24w

5

Co to właściwie jest, gdy wywołujesz funkcję w taki sposób? Nie spodziewałem się, że argumenty te będą zawierały argumenty wywołania!

this keyword rzeczywiście odnosi się do funkcji test - to jest to, czego called go. Możesz potwierdzić to logując się na this === test. To jest ta własność arguments? A very deprecated one, która jest ustawiona na aktualną arguments object podczas wywoływania funkcji (i później usunięta, co wydaje się być powodem, dla którego console.dir nie przechwyciło go poprawnie). Nie używaj go i nie przejmuj się :-)

+0

Świetna, szczegółowa odpowiedź! Obawiam się, że Pigułki Wybuchowe tylko Cię uderzą w cios :) – c24w

Powiązane problemy