Masyvo perdavimas kaip funkcijų parametras javascript

Norėčiau skambinti funkcijai, naudojant masyvą kaip parametrus:

 const x = ['p0', 'p1', 'p2']; call_me(x[0], x[1], x[2]); // I don't like it function call_me (param0, param1, param2 ) { // ... } 

Ar yra geresnis būdas perduoti x turinį į call_me() ?

233
18 мая '10 в 12:42 2010-05-18 12:42 Robertas yra nustatytas gegužės 18 d., 10 val. 12:42 2010-05-18 12:42
@ 9 atsakymai
 const args = ['p0', 'p1', 'p2']; call_me.apply(this, args); 

Žr. MDN dokumentus, skirtus „ Function.prototype.apply() .


Jei aplinka palaiko ECMAScript 6, galite naudoti platinimo argumentą :

 call_me(...args); 
335
18 мая '10 в 12:44 2010-05-18 12:44 atsakė Kaptajnkoldui gegužės 10 d., 10 val

Kodėl jūs neperduodate visos masyvo ir apdorojate jį kaip reikia viduje funkcijos viduje?

 var x = [ 'p0', 'p1', 'p2' ]; call_me(x); function call_me(params) { for (i=0; i<params.length; i++) { alert(params[i]) } } 
77
18 мая '10 в 12:59 2010-05-18 12:59 atsakė Karl Johan'ui gegužės 10 d. 12:59 2010-05-18 12:59

Darant prielaidą, kad call_me yra pasaulinė funkcija, nesitikite, kad jis bus nustatytas.

 var x = ['p0', 'p1', 'p2']; call_me.apply(null, x); 
41
18 мая '10 в 13:05 2010-05-18 13:05 atsakymą pateikė plexeris gegužės 18 d., 10 val., 15:05 , 2010-05-18 13:05

ES6 standarte atsirado naujas platinimo operatorius ... ką jis daro.

 call_me(...x) 

Ją palaiko visos pagrindinės naršyklės, išskyrus IE.

Paskirstymo operatorius gali atlikti daug kitų naudingų dalykų, o susiję dokumentai tai tikrai rodo.

33
11 янв. Atsakymas duotas BoltKey 11 sausis 2016-01-11 21:25 '16 at 21:25 2016-01-11 21:25

Kaip atsakė @KaptajnKold

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

Ir jums nereikia apibrėžti visų call_me funkcijos parametrų. Galite naudoti arguments

 function call_me () { // arguments is a array consisting of params. // arguments[0] == 'p0', // arguments[1] == 'p1', // arguments[2] == 'p2' } 
5
18 февр. Atsakymas pateikiamas 竟 竟 峰 18 vasario mėn. 2015-02-18 22:51 '15, 10:51 pm 2015-02-18 22:51

Atkreipkite dėmesį į tai

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

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

html puslapis

 <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> 

gali skambinti funkcijai su bet kokiais argumentais

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

arba

 <body onmousemove="FollowMouse(d1)"> 
3
28 февр. atsakymas duotas ali.by 28 vasaris 2015-02-28 11:03 '15 - 11:03 2015-02-28 11:03

Argumentai gali būti funkcijų argumentai:

platinimą : 

1
12 авг. atsakymą pateikė vsync 12 rug . 2018-08-12 22:02 '18 prie 10:02 pm 2018-08-12 22:02

Atsakymas jau buvo duotas, bet aš tik noriu pateikti tortą. Tai, ką norite pasiekti, vadinama method borrowing JS kontekste, kad kai mes paimame metodą iš objekto ir jį vadiname kito objekto kontekste. Paprastai įprasta taikyti masyvo metodus ir taikyti juos argumentams. Leiskite jums pateikti pavyzdį.

Taigi, mes turime „super“ maišymo funkciją, kuri užima du numerius kaip argumentą ir grąžina „super saugų“ skaldytą eilutę:

 function hash() { return arguments[0]+','+arguments[1]; } hash(1,2); // "1,2" whoaa 

Jis vis dar yra toks geras, tačiau mes turime keletą problemų, susijusių su minėtu požiūriu, jis yra ribotas, jis veikia tik su dviem skaičiais, kurie nėra dinamiški, leiskite jam dirbti su bet kuriuo skaičiumi, ir jums nereikia perduoti masyvo (galite, jei vis dar esate) reikalauti). Gerai, nustoti kalbėti, tegul kovoti!

Natūralus sprendimas būtų naudoti metodą „ arr.join :

 function hash() { return arguments.join(); } hash(1,2,4,..); // Error: arguments.join is not a function 

O žmogus. Deja, tai neveiks. Kadangi mes vadiname hash (argumentus) ir argumentus, objektas yra iterable ir masinis, bet ne tikras masyvas. Kaip apie toliau pateiktą metodą?

 function hash() { return [].join.call(arguments); } hash(1,2,3,4); // "1,2,3,4" whoaa 

Triukas vadinamas method borrowing.

Naudojame join metodą iš įprastos [].join. Ir naudokite [].join.call paleisti jį arguments kontekste.

Kodėl tai veikia?

Taip yra todėl, kad vidinis vietinio metodo arr.join(glue) algoritmas arr.join(glue) labai paprastas.

Paimta iš specifikacijos beveik „kaip yra“:

 Let glue be the first argument or, if no arguments, then a comma ",". Let result be an empty string. Append this[0] to result. Append glue and this[1]. Append glue and this[2]. …Do so until this.length items are glued. Return result. 

Taigi techniniu požiūriu ji ją priima ir sujungia [0], [1] ... ir tt Kartu Jis yra sąmoningai parašytas taip, kad bet koks toks masyvas leidžia (be sutapimo, daugelis metodų vadovaujasi šia praktika). Štai kodėl ji taip pat veikia su this=arguments.

0
05 окт. atsakymas duotas Humoyun Oct 05 2018-10-05 04:34 '18, 4:34

1 - galite prisijungti prie masyvo į eilutę
2-perduokite jį funkcijai
Trys skambučiai

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

skambučio metodas:

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

ar netgi

 myFunction("orange,Apple,fruits"); 
-6
02 февр. Hojjatollah Bakhtiyari Kiya atsakymas 02 Feb. 2016-02-02 08:49 '16 at 8:49 AM 2016-02-02 08:49

Kiti klausimai dėl „ etikečių arba Užduoti klausimą