Załóżmy, że mam następujący kod (całkowicie bezużyteczne, wiem)Czy można bezpiecznie przechodzić „argumenty” do „apply()”
function add(a, b, c, d) {
alert(a+b+c+d);
}
function proxy() {
add.apply(window, arguments);
}
proxy(1,2,3,4);
Zasadniczo wiemy, że stosuje się spodziewa tablicę jako drugi parametr , ale wiemy też, że arguments
nie jest odpowiednią tablicą. Kod działa zgodnie z oczekiwaniami, więc czy można powiedzieć, że mogę przekazać dowolny obiekt podobny do tablicy jako drugi parametr w apply()
?
Następujące będzie również działać (przynajmniej w Chrome):
function proxy() {
add.apply(window, {
0: arguments[0],
1: arguments[1],
2: arguments[2],
3: arguments[3],
length: 4
});
}
Aktualizacja: Wydaje się, że mój drugi blok kodu nie w IE < 9 natomiast pierwsza (przechodząc arguments
) działa. Błąd to Array or arguments object expected
, więc wyciągniemy wniosek, że zawsze bezpiecznie jest przekazać arguments
, podczas gdy nie jest bezpiecznie przekazać obiekt podobny do tablicy w oldIE.
Dlaczego nie powinienem być "bezpieczny"? – Neal
@Neal well 'arguments' jest dość dziwną bestią, więc pewne obawy o jej użycie nie są nierozsądne. W tym przypadku nie mogę sobie wyobrazić, jak to by było problemem. – Pointy
@Neal, może dlatego, że 'arguments' nie ma wielu metod, które ma zwykła tablica, a' .apply' może chcieć z nich skorzystać? – Dogbert