Var functionName = funkcija () {} vs funkcija functionName () {}

Neseniai pradėjau palaikyti kito vartotojo „JavaScript“ kodą. Ištaisysiu klaidas, pridedu funkcijas ir bandau tvarkyti kodą ir padaryti jį nuoseklesnę.

Ankstesnis kūrėjas naudoja du būdus, kaip deklaruoti funkcijas, ir aš negaliu suprasti, ar tai yra priežastis.

Du būdai:

 var functionOne = function() { // Some code }; 
 function functionTwo() { // Some code } 

Kokios yra šių dviejų skirtingų metodų taikymo priežastys ir kokie yra kiekvieno iš jų privalumai ir trūkumai? Ar yra kažkas, ką galima padaryti vienu metodu, kurio negalima padaryti su kitu?

6296
03 дек. Richard Garside paklausė 03 d 2008-12-03 14:31 '08 at 14:31 pm 2008-12-03 14:31
@ 37 atsakymai
  • 1
  • 2

Tai vadinama funkcijų išraiška:

 var getRectArea = function(width, height) { return width * height; }; console.log("Area of Rectangle: " + getRectArea(3,4)); // This should return the following result in the console: // Area of Rectangle: 12 

Tai vadinama funkcijų deklaracija:

 var w = 5; var h = 6; function RectArea(width, height) { //declaring the function return area = width * height; } //note you do not need ; after } RectArea(w,h); //calling or executing the function console.log("Area of Rectangle: " + area); // This should return the following result in the console: // Area of Rectangle: 30 

Tikiuosi, kad tai padės paaiškinti skirtumą tarp funkcijos išraiškos ir funkcijos deklaravimo bei jų naudojimo. Ačiū.

1
15 июля '18 в 1:56 2018-07-15 01:56 Atsakymą davė Kean Amaral liepos 18 d. 18 val. 1:56 2018-07-15 01:56

Išraiška JS : kas grąžina vertę
Pavyzdys. Išbandykite chromą konsolėje:

 a = 10 output : 10 (1 + 3) output = 4 

Deklaracija / pareiškimas : kas negrąžina vertės
Pavyzdys:

 if (1 > 2) { // do something. } 

čia (1> 2) yra išraiška, bet „jei“ statula nėra. Jis nieko negrąžina.


Panašiai mes turime funkciją „Declare / Expression vs Expression“
Paimkime pavyzdį:

 // test.js var a = 10; // function expression var fun_expression = function() { console.log("Running function Expression"); } // funciton expression function fun_declaration() { console.log("Running function Statement"); } 

Svarbu. Kas atsitinka, kai „JavaScript“ varikliai veikia virš failo js.

  • Kai vykdomas js, įvyksta:

    1. Atmintis bus sukurta kintamuoju „a“ ir „fun_expression“. Ir atmintis bus sukurta norint išreikšti „fun_declaration“ funkciją.
    2. „a“ bus priskirtas „neapibrėžtam“. „fun_expression“ bus nustatytas kaip „undefined“. „fun_declaration“ bus visiškai prisiminta.
      Pastaba 1 ir 2 etapai vadinami „vykdymo kontekstu - kūrimo etapu“ .

Dabar tarkime, kad mes atnaujiname JS anksčiau.

 // test.js console.log(a) //output: udefined (No error) console.log(fun_expression) // output: undefined (No error) console.log(fun_expression()) // output: Error. As we trying to invoke undefined. console.log(fun_declaration()) // output: running function statement (As fun_declaration is already hoisted in the memory). var a = 10; // function expression var fun_expression = function() { console.log('Running function expression') } // function declaration function fun_declaration() { console.log('running function declaration') } console.log(a) // output: 10 console.log(fun_expression()) //output: Running function expression console.log(fun_declaration()) //output: running function declaration 

Minėtas komentarų rezultatas turėtų būti naudingas suprasti skirtumus tarp funkcijos išraiškos ir funkcijos / deklaracijos išraiška.

0
15 мая '18 в 3:22 2018-05-15 03:22 atsakymą pateikė Santos Pillai gegužės 15 d. 18 val. 3:22 2018-05-15 03:22

Kitas skirtumas tarp dviejų funkcijų yra tas, kad funkcijaOne gali būti naudojama kaip kintamasis, kuriame gali būti keletas funkcijų. Prašome patikrinti toliau:

  var functionOne = (function() { return { sayHello: function(){ console.log('say hello') }, redirectPage:function(_url){ window.location.href = _url; } } })(); 

Galite pasirinkti, kurią funkciją skambinti. pavyzdžiui, funkcijaOne.sayHello arba functionOne. peradresavimasPage. Ir jei paskambinsite funkcijomis, tada bus atliktas visas kodo blokas.

0
02 янв. Atsakymą pateikė H. Ostwal 02 Jan 2019-01-02 09:50 '19 , 9:50 am 2019-01-02 09:50

Pavadintos funkcijos ir anoniminės funkcijos

Anoniminių funkcijų išraiškos greitai ir lengvai įvedamos, o daugelis bibliotekų ir įrankių palaiko šį idiomatinį kodo stilių. Tačiau jie turi keletą trūkumų :

  1. Anoniminės funkcijos neturi naudingo pavadinimo, kuris būtų rodomas kamino pėdsakuose, o tai gali apsunkinti derinimą.
  2. Nėra pavadinimo, jei funkcija turėtų būti susijusi su pačiu, rekursiu ir pan.
  3. Anoniminės funkcijos praleidžia pavadinimą, kuris gali sukelti mažiau skaitomą kodą.

Funkcijų pavadinimo išraiškos

Vardas, leidžiantis išreikšti jūsų funkciją, gana veiksmingai pašalina visus šiuos trūkumus ir neturi pastebimų trūkumų. Geriausia visada skambinti savo funkcijos išraiškomis:

 setTimeout(function timeHandler() { // <-- named function here! console.log('I've waited 1 second'); }, 1000); 

Skubios vadinamosios funkcijos (IIFE) išraiška:

 var a = 42; (function IIFE(global) { // <-- named IIFEs! console.log(global.a); // 42 })(window); 

Pastaba: funkcijoms, priskirtoms kintamajam, funkcijos pavadinimas šiuo atveju nėra labai dažnas ir gali sukelti painiavą, šiuo atveju geriau naudoti rodyklės funkciją.

0
17 дек. Atsakymas suteikiamas Šekspyrui 2018-12-17 19:58 18 m. 18 val. 2018-12-17 19:58

Reikėtų atkreipti dėmesį į vieną svarbų dalyką:

Tegul yra dvi funkcijos: -

 sum(1,2); const sum = function(first, second) { return first + second; } 

Pirmiau minėtu atveju jis sukurs klaidą, kad suma yra neapibrėžta, bet

 sum(1,2); function sum(first, second) { return first + second; } 

Ši funkcija nesukels klaidos, nes šiuo atveju atsiras function hoisting .

0
18 окт. Atsakyti Nitesh Ranjan 18 oct. 2018-10-18 21:57 '18 21:57 2018-10-18 21:57

Norėčiau apibrėžti funkciją kaip kintamąjį:

 let first = function(x){ return x[0]; } 

Vietoj:

 function first(){ .... } 

Kadangi galiu apibrėžti funkciją, galiu naudoti išraiškas ir dekoratorius. Pavyzdžiui:

 let safe = function(f){ try {f()...} } let last = safe(function(x){return x[0]}). 

Taip pat su ES6 jis yra daug trumpesnis:

  let last = x => x[0] ........... function last(x){ return x[0]; } ...... let last = safe(x => x[0]); 
0
08 марта '18 в 14:49 2018-03-08 14:49 atsakymą pateikė vartotojo2693928 kovo 8 '18, 14:49 2018-03-08 14:49

aiškumo

Atsižvelgiant į funkciją, perduotą kaip parametrą kitai funkcijai, asmeniškai man lengviau perkelti kintamojo vardą, o ne pačią funkcijų deklaraciją.


Pavyzdžiui, naudokite šį sumažinimo metodą iš bibliotekos „Underscore.js“.

var sum = _.reduce([1, 2, 3], function(memo, num){ return memo + num; }, 0);

_.reduce trunka tris parametrus, o vienas iš šių parametrų yra funkcijos deklaracija:

function(memo, num){ return memo + num; }


Vienoje eilutėje įvyksta daug dalykų, todėl konvertuokite šią funkcijų deklaraciją į frazę:

var iteratee = function(memo, num){ return memo + num; }


Čia yra tas pats _.reduce metodas, naudojant vietoj kintamojo pavadinimo, ir tai yra daug lengviau akims:

var sum = _.reduce([1, 2, 3], iteratee, 0);

0
01 февр. atsakymas pateikiamas po pirmadienio 01 vasario mėn. 2019-02-01 12:20 '19 , 12:20 val. 2019-02-01 12:20
  • 1
  • 2

Kiti klausimai apie „ žymų arba Užduoti klausimą