Javascript kintamas argumentų skaičius funkcijai

Ar yra būdas leisti „neribotam“ variantui atlikti „JavaScript“ funkciją?

Pavyzdys:

 load(var1, var2, var3, var4, var5, etc...) load(var1) 
394
26 янв. Timo yra nustatytas 26 sausis 2010-01-26 21:06 '10, 21:06, 2010-01-26 21:06
@ 11 atsakymų

Žinoma, tiesiog naudokite arguments .

 function foo() { for (var i = 0; i < arguments.length; i++) { alert(arguments[i]); } } 
640
26 янв. atsakymas pateikiamas roufamatic 26 jan. 2010-01-26 21:08 '10 - 21:08 2010-01-26 21:08

Susiję klausimai


Susiję klausimai

Kita galimybė - perduoti argumentus konteksto objektui.

 function load(context) { // do whatever with context.name, context.address, etc } 

ir naudokite jį taip:

 load({name:'Ken',address:'secret',unused:true}) 

Tai turi pranašumą, kad jūs galite pridėti tiek norimų argumentų, kiek norite, ir funkcija gali (ar ne) naudoti juos, kaip matote.

96
26 янв. atsakymas buvo pateiktas Keniui sausio 26 d. 2010-01-26 21:34 '10, 21:34, 2010-01-26 21:34

Sutinku su Ken dinamiškiausiu atsakymu, ir aš norėčiau tai padaryti dar labiau. Jei tai funkcija, kurią kelis kartus skambinate su skirtingais argumentais, naudoju „Ken“ dizainą ir tada pridėkite numatytųjų reikšmių:

 function load(context) { var defaults = { parameter1: defaultValue1, parameter2: defaultValue2, ... }; var context = extend(defaults, context); // do stuff } 

Taigi, jei turite daug parametrų, tačiau jums nereikia nustatyti jų kiekvieną kartą, kai skambinate funkcijai, galite tiesiog nurodyti nestandartines vertes. $.extend() metodui galite naudoti jQuery plėtinio metodą ( $.extend() ), sukurti savo arba naudoti šiuos veiksmus:

 function extend() { for (var i = 1; i < arguments.length; i++) for (var key in arguments[i]) if (arguments[i].hasOwnProperty(key)) arguments[0][key] = arguments[i][key]; return arguments[0]; } 

Tai sujungs konteksto objektą su numatytosiomis reikšmėmis ir užpildys visas neapibrėžtas reikšmes jūsų numatytame objekte.

46
23 июля '12 в 17:11 2012-07-23 17:11 atsakymas pateikiamas mbeasley liepos 23 d., 12 val., 17:11, 2012-07-23 17:11

Šiuolaikinėse naršyklėse su šia sintakse galite priimti kintamą skaičių argumentų:

 function my_log(...args) { //args is an Array console.log(args); //You can pass this array as parameters to another function console.log(...args); } 
44
20 авг. Atsakymą pateikė Ramast 20 rug . 2016-08-20 07:46 '16 at 7:46 am 2016-08-20 07:46

Taip, kaip šis:

 function load() { var var0 = arguments[0]; var var1 = arguments[1]; } load(1,2); 
16
26 янв. atsakymas pateiktas Canavar 26 jan. 2010-01-26 21:08 '10 - 21:08 2010-01-26 21:08

Kaip jau minėta, arguments galite naudoti kintamam funkcijų parametrų skaičiui gauti.

Jei norite paskambinti kitai funkcijai su tais pačiais argumentais, naudokite. Netgi galite pridėti ar pašalinti argumentus konvertuojant arguments į masyvą. Pvz., Prieš įvedant konsolę, ši funkcija įterpia tam tikrą tekstą:

 log() { let args = Array.prototype.slice.call(arguments); args = ['MyObjectName', this.id_].concat(args); console.log.apply(console, args); } 
8
12 февр. Atsakymą pateikė Peter Tseng , vasario 12 d. 2016-02-12 05:27 '16 at 17:27 pm 2016-02-12 05:27

Nors apskritai sutinku, kad minėtas argumentų metodas yra naudingas ir lankstus (jei nesirūpinate užsakymu, argumentai šiuo atveju yra lengviausi), man kyla problemų dėl „mbeasley“ metodo sąnaudų (naudojant numatytąją vertę ir plėtinius). Tai yra didžiausia numatytųjų verčių išskleidimo kaina. Pirma, numatytosios reikšmės yra apibrėžtos funkcijos viduje, todėl jos perpildomos kiekviename skambutyje. Antra, galite lengvai perskaityti vardines reikšmes ir nustatyti numatytas reikšmes vienu metu naudodami || Nereikia kurti ir sujungti kito naujo objekto, kad gautumėte šią informaciją.

 function load(context) { var parameter1 = context.parameter1 || defaultValue1, parameter2 = context.parameter2 || defaultValue2; // do stuff } 

Tai yra apie tą patį kodą (galbūt šiek tiek daugiau), bet turėtų būti dalis vykdymo išlaidų.

8
08 февр. Atsakymą pateikė mcurland 08 Feb. 2013-02-08 00:59 '13 prie 0:59 2013-02-08 00:59

Pageidautina naudoti poilsio parametrų sintaksę, kaip nurodė Ramastas.

 function (a, b, ...args) {} 

Aš tiesiog noriu pridėti šiek tiek gražaus args argumento.

  • Tai masyvas, o ne objektas, kaip argumentai. Tai leidžia tiesiogiai naudoti tokias funkcijas kaip žemėlapis arba rūšiavimas.
  • Į jį neįtraukti visi parametrai, bet tik tas, kuris buvo perduotas iš jo. Pavyzdžiui. Funkcija (a, b, ... args) šiuo atveju turi argumentų argumentą argumentų
5
02 дек. Atsakymą pateikė Nicola Pedretti. 2016-12-02 18:40 '16 at 18:40 pm 2016-12-02 18:40

Naudokite arguments objektą, kai įeinate į funkciją, prie kurios turite prieigą prie visų perduotų argumentų.

5
26 янв. atsakymas duotas nickytonline 26 jan. 2010-01-26 21:08 '10 - 21:08 2010-01-26 21:08

Nors @roufamatic parodė, kad naudojami raktiniai žodžiai, o @Ken parodė puikų naudingo objekto pavyzdį, nemanau, kad aš iš tikrųjų nesvarstiau, kas vyksta šiuo atveju, ir gali painioti būsimus skaitytojus ar priversti blogą praktiką kadangi nėra aišku, kad funkcija / metodas yra skirtas kintamam argumentų / parametrų skaičiui.

 function varyArg () { return arguments[0] + arguments[1]; } 

Kai kitas kūrėjas žiūri į jūsų kodą, labai lengva manyti, kad ši funkcija nepriima parametrų. Ypač jei šis kūrėjas nėra skirtas raktiniams žodžiams. Dėl šios priežasties gerai sekti stiliaus vadovą ir laikytis nuoseklumo. Visus pavyzdžius naudosiu „Google“.

Leiskite man aiškiai nurodyti, kad ta pati funkcija turi kintamų parametrų:

 function varyArg (var_args) { return arguments[0] + arguments[1]; } 

VS objekto parametras var_args

Gali būti atvejų, kai reikalingas objektas, nes tai yra vienintelis patvirtintas ir peržiūrėtas geriausios praktikos duomenų žemėlapių metodas. Asociatyviosios masyvai sutriuškino ir nenorėjo.

SIDENOTE: argumentų raktinis žodis grąžina objektą, naudodamas skaičių kaip raktą. Prototipo paveldėjimas taip pat yra objektų rinkinys. Jei norite naudoti tinkamą masyvo naudojimą JS, žr. „Atsakymo pabaiga“.

Šiuo atveju taip pat galime tai tiesiogiai nurodyti. Pastaba Šią pavadinimo konvenciją „Google“ neteikia, tačiau tai yra pavyzdys, kaip aiškiai deklaruoti parametrų tipą. Tai svarbu, jei savo kode norite sukurti labiau apribotą tipą.

 function varyArg (args_obj) { return args_obj.name+" "+args_obj.weight; } varyArg({name: "Brian", weight: 150}); 

Kuris pasirinkti?

Tai priklauso nuo jūsų funkcijų ir programos poreikių. Pavyzdžiui, jei norite, kad visų argumentų iteraciniame procese grąžintumėte vertybių bazę, tada, žinoma, laikykitės raktinių žodžių raktinių žodžių. Jei jums reikia jūsų argumentų apibrėžimo ir duomenų atvaizdavimo, tada objekto metodas yra kelias. Pažvelkime į du pavyzdžius, o tada baigsime!

Argumentų naudojimas

 function sumOfAll (var_args) { return arguments.reduce(function(a, b) { return a + b; }, 0); } sumOfAll(1,2,3); // returns 6 

Objekto naudojimas

 function myObjArgs(args_obj) { // MAKE SURE ARGUMENT IS AN OBJECT OR ELSE RETURN if (typeof args_obj !== "object") { return "Arguments passed must be in object form!"; } return "Hello "+args_obj.name+" I see you're "+args_obj.age+" years old."; } myObjArgs({name: "Brian", age: 31}); // returns 'Hello Brian I see you're 31 years old 

Prieiga prie masyvo vietoj objekto („... args“ pertraukos parametras)

Kaip minėta pirmiau, argumentai raktinis žodis faktiškai grąžina objektą. Dėl to jums reikės paskambinti bet kuriuo metodu, kurį norite naudoti masyvui. Pavyzdys yra:

 Array.prototype.map.call(arguments, function (val, idx, arr) {}); 

Norėdami to išvengti, naudokite poilsio parametrą:

 function varyArgArr (...var_args) { return var_args.sort(); } varyArgArr(5,1,3); // returns 1, 3, 5 
3
24 февр. Atsakymą pateikė Brian Ellis , vasario 24 d. 2017-02-24 06:47 '17 at 6:47 2017-02-24 06:47

Atminkite, kad Ken perduotas objekto perdavimas su pavadintomis savybėmis prideda laikino objekto paskyrimo ir atleidimo iš kiekvieno mokesčio kainą. Paprastų argumentų perdavimas pagal vertę arba nuorodą paprastai bus efektyviausias. Daugeliui taikomųjų programų, nors našumas nėra kritiškas, tačiau kai kurioms gali būti.

2
06 авг. atsakymas duotas phbcanada 06 rug . 2014-08-06 23:25 '14, 23:25 2014-08-06 23:25