2010-05-18 16 views
205

Chciałbym wywołać funkcję przy użyciu tablicę jako parametry:Mijając tablicę jako parametr funkcji w JavaScript

const x = ['p0', 'p1', 'p2']; 
call_me(x[0], x[1], x[2]); // I don't like it 

function call_me (param0, param1, param2) { 
    // ... 
} 

Czy istnieje lepszy sposób przekazywania treści x do call_me()?

Odpowiedz

294
const args = ['p0', 'p1', 'p2']; 
call_me.apply(this, args); 

Zobacz dokumentację MDN dla Function.prototype.apply().


Jeśli środowisko obsługuje ECMAScript 6, można użyć spread argument zamiast:

call_me(...args); 
+4

Na marginesie, jeśli ktokolwiek chce zamiast tego przekazać tablicę asocjacyjną (nazwane klucze), użyj obiektu. Wychodząc z PHP (i zawsze prowadziłem do tego wątku przez google), zajęło mi to trochę czasu. Możesz wtedy przekazać cały obiekt jako parametr. http://www.w3schools.com/js/js_objects.asp – timhc22

+0

Dzięki za wskazanie argumentu "spread"! Nie wiedziałem o tym. –

66

Dlaczego nie można przejść całą tablicę i przetwarza je jako potrzebne wewnątrz funkcji?

var x = [ 'p0', 'p1', 'p2' ]; 
call_me(x); 

function call_me(params) { 
    for (i=0; i<params.length; i++) { 
    alert(params[i]) 
    } 
} 
+31

To dlatego, że nie mogę zmodyfikować call_me(). Jest on zdefiniowany w innej bibliotece i nie można zadzierać z API. – Robert

+43

+1, ponieważ mimo że nie odpowiada na oryginalne pytanie, prawdopodobnie to, czego szukało 100 000 osób, które przeglądało tę stronę. – Ishikawa

+0

Czy ktoś może wyjaśnić, co robi linia "call_me (x)"? Wydaje się, że jest to nazwa funkcji bez słowa kluczowego function? Co dokładnie robi? – swam

40

Przyjmując, że call_me jest funkcją globalną, więc nie spodziewasz się, że zostanie to ustawione.

var x = ['p0', 'p1', 'p2']; 
call_me.apply(null, x); 
5

Jak @KaptajnKold odpowiedział

var x = [ 'p0', 'p1', 'p2' ]; 
call_me.apply(this, x); 

I nie trzeba zdefiniować co parametry dla funkcji call_me albo. można po prostu użyć arguments

function call_me() { 
    // arguments is a array consisting of params. 
    // arguments[0] == 'p0', 
    // arguments[1] == 'p1', 
    // arguments[2] == 'p2' 
} 
+2

To jest taka zła praktyka ... nie będziesz w stanie zobaczyć, czego potrzebuje funkcja, a wszystkie parametry są opcjonalne, jeśli spojrzysz na funkcję. – Robin

4

Uwaga Ta

function FollowMouse() { 
    for(var i=0; i< arguments.length; i++) { 
     arguments[i].style.top = event.clientY+"px"; 
     arguments[i].style.left = event.clientX+"px"; 
    } 

}; 

// -------------------------- -

strona html

<body onmousemove="FollowMouse(d1,d2,d3)"> 

<p><div id="d1" style="position: absolute;">Follow1</div></p> 
<div id="d2" style="position: absolute;"><p>Follow2</p></div> 
<div id="d3" style="position: absolute;"><p>Follow3</p></div> 


</body> 

funkcji mogą dzwonić z wszelkimi args

<body onmousemove="FollowMouse(d1,d2)"> 

lub

<body onmousemove="FollowMouse(d1)"> 
+0

Jest to wyraźnie część odpowiedzi. "argumenty" są zdecydowanie potrzebne, aby odzyskać tablicę po wywołaniu. Dzięki! – FlorianB

25

Jest nowy spread operator... który robi dokładnie to.

call_me(...x) 

Jest standaryzowany od wersji ES6, ale nie jest jeszcze obsługiwany przez IE.

-7

1-możesz dołączyć tablicę na ciąg
2-go przekazywać funkcjonować
3-rozmowę podzielić

var fruits = ["Banana", "Orange", "Apple", "Mango"]; 
function myFunction(name) 
{ 
    var nameArray = name.split(','); 
. 
. 
. 
} 

wywołanie metody:

myFunction(fruits.join(',')); 

lub nawet

myFunction("orange,Apple,fruits"); 
Powiązane problemy