2009-12-10 12 views
13

Czy mogę wywołać funkcję z tablicą argumentów w wygodny sposób w JavaScript?Funkcja wywołania z tablicą argumentów

Przykład:

var fn = function() { 
    console.log(arguments); 
} 

var args = [1,2,3]; 

fn(args); 

muszę arguments być [1,2,3], tak jak mój tablicy.

Odpowiedz

26

Należy użyć apply:

var fn = function() { 
    console.log(arguments); 
}; 

var args = [1,2,3]; 

fn.apply(null, args); 

Zastosuj uczyni równoważne wywołanie funkcji:

fn(1,2,3); 

Zauważ, że użyłem null jako pierwszy argument apply, która będzie wyznaczać słowa kluczowego this do obiekt globalny (window) wewnątrz fn.

Również należy wiedzieć, że obiekt arguments naprawdę nie jest tablicą, to obiekt array-like, który zawiera indeksy numeryczne odpowiadające argumentów, które były wykorzystywane do nazywają swoją funkcję, właściwość length który daje liczbę użyte argumenty i właściwość arguments.callee, która jest odwołaniem do funkcji wykonującej (przydatne do rekursji na anonimowych funkcjach).

Jeśli chcesz, aby tablicę z obiektu arguments, można użyć metody Array.prototype.slice:

var fn = function() { 
    var args = Array.prototype.slice.call(arguments); 
    console.log(args); 
}; 

Edit: W odpowiedzi na Twój komentarz, tak, można użyć metody shift i ustawić jej zwracana wartość jako kontekst (słowa kluczowego this) na swojej funkcji:

fn.apply(args.shift(), args); 

ale należy pamiętać, że shift usunie pierwszy element z oryginalnej tablicy, a twoja funkcja zostanie wywołana bez tego pierwszego argumentu.

Jeśli nadal trzeba zadzwonić czynność ze wszystkimi innymi argumentami można:

fn.apply(args[0], args); 

A jeśli nie chcesz zmienić kontekst, można łatwo wyodrębnić pierwszego argumentu wewnątrz funkcji:

var fn = function() { 
    var args = Array.prototype.slice.call(arguments), 
     firstArg = args.shift(); 

    console.log(args, firstArg); 
}; 
+0

Co jeśli chcę zakres być pierwszy element tablicy? czy muszę go sfałszować za pomocą shift()? – David

+0

@David: Co masz na myśli pod pojęciem zakresu? Słowo kluczowe "this"? – CMS

+0

Tak, używając apply(), pierwszy argument staje się zasięgiem (tym) dla funkcji, prawda? Zakres w tym przypadku musi być pierwszym elementem tablicy. – David

5

W ECMAScript 6, można użyć spread syntax (...) do tego celu. Jest to o wiele prostsze i łatwiejsze do zrozumienia niż Function.prototype.apply().

przykład

Kod:

const fn = function() { 
    console.log(arguments); 
} 

const args = [1,2,3]; 

fn(...args); 
Powiązane problemy