JavaScript Arrow Functions తెలుగులో | => Syntax, Implicit Return
💬 WhatsApp సంక్షిప్త రూపాలు మరియు Arrow Functions
WhatsApp లో మనం "please" ని "plz" అని, "thanks" ని "thx" అని చిన్నగా రాస్తాం కదా? అర్థం అదే, కానీ రాయడానికి తక్కువ సమయం పడుతుంది.
Arrow functions కూడా అంతే: Chapter 12 లో నేర్చుకున్న functions నే, చిన్న రూపంలో రాసే ఆధునిక పద్ధతి (Modern ES6+ Syntax). 2015 లో JavaScript కి ఈ పద్ధతి వచ్చింది. ఇప్పుడు ఆధునిక code లో arrow functions ని చాలా ఎక్కువగా చూస్తారు, ముఖ్యంగా arrays తో పని చేసేటప్పుడు (Chapter 15). కాబట్టి వీటిని బాగా అలవాటు చేసుకోవడం చాలా ముఖ్యం!
- Arrow function యొక్క syntax (
=>) - Normal function ని arrow function గా మార్చడం (3 సులభమైన దశలు)
- Implicit return (return కీవర్డ్ లేకుండానే నేరుగా ఫలితం ఇవ్వడం)
- Parentheses
( )ఎప్పుడు అవసరం, ఎప్పుడు కాదు? - Object ని return చేసేటప్పుడు ఏం చేయాలి?
- Arrow function మరియు normal function మధ్య కీలకమైన తేడాలు
- Beginners చేసే 6 సాధారణ తప్పులు (Real Node.js outputs తో)
- సమగ్ర ప్రాక్టీస్ ప్రశ్నలు & సమాధానాలు
Chapter 12 లో రాసిన add function ని తీసుకుందాం. దీన్ని అంచెలంచెలుగా చిన్నది చేద్దాం:
దశ 1: Normal function (పాత పద్ధతి)
function add(a, b) {
return a + b;
}
దశ 2: Arrow function ({ } మరియు return తో)
function అనే పదాన్ని తీసేసి, parameters తర్వాత => (arrow) పెట్టి, function ని ఒక variable లో దాస్తాం:
const add = (a, b) => {
return a + b;
};
దశ 3: ఇంకా చిన్నది (Implicit Return)
Function body లో కేవలం return ఒక్కటే ఉంటే, { } మరియు return రెండింటినీ తీసేయొచ్చు. => తర్వాత రాసిన విలువ ఆటోమేటిక్ గా return అవుతుంది!
const add = (a, b) => a + b;
మూడూ ఒకే పని చేస్తాయి — లైవ్ పరిశీలన:
function addOld(a, b) { return a + b; }
const add1 = (a, b) => { return a + b; };
const add2 = (a, b) => a + b;
console.log(addOld(3, 4), add1(3, 4), add2(3, 4));
7 7 7
🎯 Syntax సూత్రం:
const పేరు = (parameters) => ఫలితం;
• => ని "arrow" (బాణం) అంటారు.
• "parameters ఇవి, వాటితో వచ్చే ఫలితం ఇది" అని చదువుకోవచ్చు.
• (a, b) => a + b అంటే: "a మరియు b తీసుకో, a + b ని ఇవ్వు".
Parameters సంఖ్యను బట్టి కుండలీకరణాలు ( ) రాయాలా వద్దా అనే నియమాలు మారతాయి:
| Parameters సంఖ్య | ఎలా రాయాలి? | ఉదాహరణ |
|---|---|---|
| ఒక్కటి (Single) | ( ) ఐచ్ఛికం (రాయొచ్చు, రాయకపోవచ్చు) |
n => n * n |
| ఏమీ లేవు (Zero) | ( ) తప్పనిసరి |
() => console.log("Hi!") |
| రెండు లేదా ఎక్కువ (2+) | ( ) తప్పనిసరి |
(a, b) => a + b |
1. ఒకే parameter ఉన్నప్పుడు:
const square = n => n * n;
console.log(square(5));
25
2. Parameters ఏమీ లేనప్పుడు:
const hello = () => console.log("Hi!");
hello();
Hi!
3. Default parameter తో:
Default parameter (Chapter 12) ఉంటే, ఒక్క parameter అయినా సరే ( ) తప్పనిసరిగా పెట్టాలి:
const greet = (name = "అతిథి") => `నమస్కారం ${name}!`;
console.log(greet());
console.log(greet("సీత"));
నమస్కారం అతిథి!
నమస్కారం సీత!
ఇది arrow functions లో అత్యంత ముఖ్యమైన నియమం. { } (కర్లీ బ్రేసెస్) ఉన్నాయా లేవా అనేదాన్ని బట్టి return నియమం మారుతుంది:
| రూపం | Return ఎలా జరుగుతుంది? |
|---|---|
{ } లేకుండా:n => n * n |
ఆటోమేటిక్ గా విలువ return అవుతుంది (దీనినే Implicit Return అంటారు). |
{ } తో:n => { return n * n; } |
return ని మనమే రాయాలి (Explicit Return). రాయకపోతే undefined వస్తుంది. |
ఉదాహరణ 1: సరి సంఖ్యా? (isEven)
const isEven = n => n % 2 === 0;
console.log(isEven(10));
console.log(isEven(7));
true
false
ఉదాహరణ 2: పేరుతో పలకరింపు
const greet = name => `నమస్కారం ${name}!`;
console.log(greet("రవి"));
నమస్కారం రవి!
ఉదాహరణ 3: ఎక్కువ లైన్లు ఉన్న function (Multiple Statements)
Function లో ఒకటి కంటే ఎక్కువ statements ఉంటే, { } మరియు return తప్పనిసరి:
const calculateTotal = (price, qty) => {
const subtotal = price * qty;
return subtotal + subtotal * 18 / 100;
};
console.log(calculateTotal(250, 3));
885
₹250 × 3 = ₹750, దానికి 18% GST (₹135) కలిపి ₹885.
Object (కర్లీ బ్రాకెట్లలో { name: value } జతలు) గురించి మనం Chapter 16 లో సమగ్రంగా నేర్చుకుంటాం. ఇప్పుడు ఇది పూర్తిగా అర్థం కాకపోయినా పర్వాలేదు, ఒక చిన్న జాగ్రత్తగా తెలుసుకోండి:
Implicit return తో object ఇవ్వాలంటే, object ని కుండలీకరణాలు ( ) లో పెట్టాలి:
const makeUser = (name) => ({ name: name, active: true });
console.log(makeUser("రవి"));
{ name: 'రవి', active: true }
కుండలీకరణాలు లేకపోతే ఏం జరుగుతుంది?
కుండలీకరణాలు లేకపోతే JavaScript ఇంజిన్ కి గందరగోళం వస్తుంది. { } ని object అనుకోవాలా, లేక function యొక్క body అనుకోవాలా? అది function body అని భావిస్తుంది:
const bad = name => { name: name };
console.log(bad("రవి"));
undefined
{ name: name } ని function యొక్క body గా చూసింది, అందులో return లేదు, కాబట్టి undefined వచ్చింది. అందుకే object ని return చేసేటప్పుడు ( { ... } ) అని రాయాలి!
Arrow functions ని ఎక్కువగా వాడేది, ఇంకో function కి ఒక చిన్న పనిని "ఇలా చెయ్యి" అని అందించడానికి (Callbacks). ముఖ్యంగా arrays తో:
console.log([1, 2, 3].map(n => n * 2));
console.log([1, 2, 3, 4, 5, 6].filter(n => n % 2 === 0));
[ 2, 4, 6 ]
[ 2, 4, 6 ]
• map(n => n * 2): లిస్ట్ లోని ప్రతి సంఖ్యను రెట్టింపు చేసి కొత్త లిస్ట్ ఇస్తుంది.
• filter(n => n % 2 === 0): సరి సంఖ్యలను మాత్రమే ఉంచుతుంది.
ఇప్పుడు ఇది పూర్తిగా అర్థం కాకపోయినా పర్వాలేదు! Arrays ని Chapter 14 లో, వాటి methods ని Chapter 15 లో నేర్చుకుంటాం. అప్పుడు ఈ arrow functions ఎంత సౌకర్యంగా ఉంటాయో తెలుస్తుంది. ఇక్కడ గమనించాల్సింది ఒక్కటే: n => n * 2 అనేది పేరు లేకుండా, నేరుగా రాసిన ఒక చిన్న సొగసైన function!
రెండూ ఒకే పని చేస్తాయి, కానీ కొన్ని ముఖ్యమైన తేడాలు ఉన్నాయి:
| అంశం (Aspect) | Normal function (declaration) | Arrow function |
|---|---|---|
| రాయడం (Syntax) | function add(a, b) { return a + b; } |
const add = (a, b) => a + b; |
| Hoisting | Declare చేయకముందే call చేయొచ్చు | Declare చేసిన తర్వాతే call చేయాలి |
| this విలువ | తనదైన సొంత this ఉంటుంది |
తనకు సొంత this ఉండదు, బయటి దాన్ని వాడుతుంది (Lexical this) |
| ఎక్కడ వాడతాం? | ప్రధానమైన, పేరున్న పెద్ద functions | చిన్న functions, callbacks, array operations |
1. Hoisting తేడా:
Arrow function ఒక variable లో దాచిన function expression. కాబట్టి Chapter 12 లో చూసినట్లే, declare చేయకముందే వాడితే error వస్తుంది:
console.log(cube(3));
const cube = n => n ** 3;
ReferenceError: Cannot access 'cube' before initialization
2. this తేడా (చిన్న పరిచయం):
this అనేది objects తో పని చేసేటప్పుడు వచ్చే ఒక ప్రత్యేకమైన విషయం. Arrow functions కి తమ సొంత this ఉండదు (దీనినే Lexical this అంటారు). ఇది objects (Chapter 16) మరియు DOM events (Chapter 21) నేర్చుకునేటప్పుడు చాలా ఉపయోగపడుతుంది. ఇప్పటికి కేవలం తెలుసుకోండి, ఆందోళన అవసరం లేదు!
- చిన్న, ఒక్క లైన్ functions మరియు callbacks కి: arrow function వాడండి. కోడ్ చాలా క్లీన్ గా ఉంటుంది.
- పెద్ద, ప్రధానమైన, పేరున్న functions కి: normal function declaration (ముందే call చేసే వీలు, చదవడానికి సులభం).
1. { } ఉన్నా return రాయకపోవడం:
const noReturn = (a, b) => {
a + b;
};
console.log(noReturn(2, 3));
{ } రాస్తే implicit return ఆగిపోతుంది. return a + b; అని రాయాలి, లేదా { } తీసేసి (a, b) => a + b అని రాయాలి.
2. Object ని return చేసేటప్పుడు ( ) పెట్టకపోవడం:
పైన చూసినట్లు, name => { name: name } అనేది undefined ఇస్తుంది. name => ({ name: name }) అని రాయండి.
3. Parameters లేకపోతే ( ) రాయకపోవడం:
const hi = => 5;
Parameters లేనప్పుడు కూడా ఖాళీ కుండలీకరణాలు () => 5 తప్పనిసరి!
4. Declare చేయకముందే arrow function ని వాడటం:
ReferenceError: Cannot access 'cube' before initialization వస్తుంది. వాడటానికి ముందే రాయండి.
5. => మరియు >= ని కలిపేయడం (అత్యంత ప్రమాదకరమైన బగ్):
>= అంటే "ఎక్కువ లేదా సమానం" (comparison). => అంటే arrow. రెండూ వేరు, అక్షరాల క్రమం మారితే అర్థం మారిపోతుంది:
const a = 5;
const b = 3;
if (a => b) {
console.log("ఎప్పుడూ ఇది వస్తుంది");
}
ఇక్కడ a => b ని JavaScript పోలికగా కాకుండా, ఒక arrow function (a తీసుకుని b ఇచ్చేది) గా భావించింది. Function ఎప్పుడూ truthy కాబట్టి if ఎప్పుడూ run అవుతుంది, a మరియు b విలువలు ఏమైనా సరే! (Error కూడా రాదు, అందుకే కనిపెట్టడం చాలా కష్టం). పోల్చాలంటే a >= b అని రాయండి.
6. ప్రతిదానికీ blindly arrow function వాడేయడం:
చిన్న functions కి arrow బాగుంటుంది. కానీ ఎక్కువ లైన్ల పెద్ద functions కి normal function పేరుతో రాస్తే చదవడానికి, ముందే call చేయడానికి సులభంగా ఉంటుంది.
కింది normal functions ని arrow functions గా మార్చి రాయండి:
-
function double(n) { return n * 2; }ని arrow function గా మార్చండి.double(7)ని call చేసి చూడండి. -
function fullName(first, last) { return `${first} ${last}`; }ని arrow function గా మార్చండి.fullName("Ravi", "Kumar")తో test చేయండి. -
function isAdult(age) { return age >= 18; }ని arrow function గా మార్చండి.isAdult(20)తో test చేయండి. -
priceమరియుpercentఇస్తే, discount తీసేశాక ధర return చేసే arrow function రాయండి. ఎక్కువ లైన్లు వాడండి ({ }మరియుreturnతో).discountedPrice(500, 10)తో test చేయండి. -
ఈ arrow function
undefinedఎందుకు ఇస్తుంది? సరిచేయండి:const multiply = (a, b) => { a * b; };
👉 సమాధానాలు చూడండి
1. double function:
const double = n => n * 2;
console.log(double(7));
2. fullName function:
const fullName = (first, last) => `${first} ${last}`;
console.log(fullName("Ravi", "Kumar"));
3. isAdult function:
const isAdult = age => age >= 18;
console.log(isAdult(20));
4. discountedPrice function:
const discountedPrice = (price, percent) => {
const discount = price * percent / 100;
return price - discount;
};
console.log(discountedPrice(500, 10));
(500 లో 10% = 50, 500 - 50 = 450.)
5. multiply సరిదిద్దడం:
{ } ఉన్నా return లేదు. రెండు విధాలుగా సరిచేయొచ్చు:
// పద్ధతి 1: return రాయడం
const multiply = (a, b) => { return a * b; };
// లేదా పద్ధతి 2: { } తీసేసి implicit return వాడటం
const multiply2 = (a, b) => a * b;
ఈ code ని మన compiler లో run చేయండి. రెండు arrow functions, ఒకదానిలో ఇంకొకటి వాడాం:
const add = (a, b) => a + b;
const square = n => n * n;
console.log(add(3, 4));
console.log(square(add(3, 4)));
7
49
add(3, 4) = 7, ఆ 7 ని square కి ఇస్తే 49. ఇప్పుడు విలువలు మార్చి, మీ సొంత arrow function (ఉదా: triple) కూడా రాసి చూడండి!
📌 సారాంశం (Quick Summary):
- Arrow function అంటే function ని
=>తో చిన్నగా రాసే ఆధునిక పద్ధతి:const add = (a, b) => a + b; { }లేకపోతే విలువ ఆటోమేటిక్ గా return అవుతుంది (implicit return).{ }ఉంటేreturnమనమే రాయాలి.- ఒక parameter అయితే
( )ఐచ్ఛికం. Parameters లేకపోతే లేదా రెండు, అంతకంటే ఎక్కువ ఉంటే( )తప్పనిసరి. - Object ని implicit గా return చేయాలంటే
( { ... } )అని కుండలీకరణాల్లో పెట్టాలి. - Arrow functions కి hoisting ఉండదు (declare చేశాకే వాడాలి). వాటికి సొంత
thisఉండదు. =>(arrow) మరియు>=(ఎక్కువ లేదా సమానం) వేర్వేరు.- చిన్న functions మరియు callbacks కి arrow, పెద్ద ప్రధాన functions కి normal function మంచిది.
👉 తర్వాతి పాఠం: Arrays →
ఇప్పటివరకు మనం ఒక్కో విలువను ఒక్కో variable లో దాచాం. తర్వాతి పాఠంలో ఒకే చోట చాలా విలువలను నిల్వ చేసే జాబితాలు (Lists) — Arrays (క్రియేట్ చేయడం, యాక్సెస్ చేయడం, push/pop) గురించి నేర్చుకుందాం!