தமிழ்

ஜாவாஸ்கிரிப்ட் க்ளோஷர்களை நடைமுறை உதாரணங்கள் மூலம் ஆராயுங்கள், அவை எவ்வாறு செயல்படுகின்றன மற்றும் மென்பொருள் மேம்பாட்டில் அவற்றின் நிஜ உலகப் பயன்பாடுகளைப் புரிந்துகொள்ளுங்கள்.

ஜாவாஸ்கிரிப்ட் க்ளோஷர்கள்: நடைமுறை உதாரணங்களுடன் தெளிவுபடுத்துதல்

க்ளோஷர்கள் ஜாவாஸ்கிரிப்டில் ஒரு அடிப்படைக் கருத்தாகும், இது அனைத்து நிலைகளிலும் உள்ள டெவலப்பர்களுக்கு அடிக்கடி குழப்பத்தை ஏற்படுத்துகிறது. திறமையான, பராமரிக்கக்கூடிய மற்றும் பாதுகாப்பான குறியீட்டை எழுதுவதற்கு க்ளோஷர்களைப் புரிந்துகொள்வது மிகவும் முக்கியமானது. இந்த விரிவான வழிகாட்டி நடைமுறை உதாரணங்களுடன் க்ளோஷர்களை தெளிவுபடுத்தி, அவற்றின் நிஜ உலகப் பயன்பாடுகளை விளக்கும்.

க்ளோஷர் என்றால் என்ன?

சுருக்கமாகச் சொன்னால், ஒரு க்ளோஷர் என்பது ஒரு ஃபங்ஷன் மற்றும் அந்த ஃபங்ஷன் அறிவிக்கப்பட்ட லெக்சிகல் சூழலின் கலவையாகும். இதன் பொருள், வெளி ஃபங்ஷன் செயல்படுத்தப்பட்டு முடிந்த பிறகும், ஒரு க்ளோஷர் அதன் சுற்றியுள்ள ஸ்கோப்பிலிருந்து மாறிகளை அணுக அனுமதிக்கிறது. இதை, உள் ஃபங்ஷன் அதன் சூழலை "நினைவில்" வைத்திருப்பதாகக் கருதலாம்.

இதை முழுமையாகப் புரிந்துகொள்ள, முக்கிய கூறுகளைப் பிரித்துப் பார்ப்போம்:

வெளி ஃபங்ஷன் திரும்பிய பிறகும், உள் ஃபங்ஷன் அதன் லெக்சிகல் ஸ்கோப்பில் உள்ள மாறிகளுக்கான அணுகலைத் தக்க வைத்துக் கொள்வதால்தான் இந்த மேஜிக் நடக்கிறது. இந்த நடத்தை ஜாவாஸ்கிரிப்ட் ஸ்கோப் மற்றும் மெமரி நிர்வாகத்தைக் கையாளும் விதத்தின் முக்கிய பகுதியாகும்.

க்ளோஷர்கள் ஏன் முக்கியமானவை?

க்ளோஷர்கள் ஒரு தத்துவார்த்த கருத்து மட்டுமல்ல; ஜாவாஸ்கிரிப்டில் உள்ள பல பொதுவான புரோகிராமிங் பேட்டர்ன்களுக்கு அவை அவசியமானவை. அவை பின்வரும் நன்மைகளை வழங்குகின்றன:

ஜாவாஸ்கிரிப்ட் க்ளோஷர்களின் நடைமுறை உதாரணங்கள்

க்ளோஷர்கள் எவ்வாறு செயல்படுகின்றன மற்றும் அவை நிஜ உலக சூழ்நிலைகளில் எவ்வாறு பயன்படுத்தப்படலாம் என்பதை விளக்க சில நடைமுறை உதாரணங்களைப் பார்ப்போம்.

உதாரணம் 1: எளிய கவுண்டர்

இந்த உதாரணம் ஒரு க்ளோஷர் ஃபங்ஷன் அழைப்புகளுக்கு இடையில் அதன் நிலையை பராமரிக்கும் ஒரு கவுண்டரை உருவாக்க எவ்வாறு பயன்படுத்தப்படலாம் என்பதைக் காட்டுகிறது.


function createCounter() {
  let count = 0;

  return function() {
    count++;
    console.log(count);
  };
}

const increment = createCounter();

increment(); // வெளியீடு: 1
increment(); // வெளியீடு: 2
increment(); // வெளியீடு: 3

விளக்கம்:

உதாரணம் 2: தனிப்பட்ட மாறிகளுடன் டேட்டா என்கேப்சுலேஷன்

க்ளோஷர்கள் தனிப்பட்ட மாறிகளை உருவாக்க பயன்படுத்தப்படலாம், இது ஃபங்ஷனுக்கு வெளியே இருந்து நேரடி அணுகல் மற்றும் மாற்றத்திலிருந்து தரவைப் பாதுகாக்கிறது.


function createBankAccount(initialBalance) {
  let balance = initialBalance;

  return {
    deposit: function(amount) {
      balance += amount;
      return balance; //விளக்கத்திற்காக திருப்பியளிக்கப்படுகிறது, void ஆக இருக்கலாம்
    },
    withdraw: function(amount) {
      if (amount <= balance) {
        balance -= amount;
        return balance; //விளக்கத்திற்காக திருப்பியளிக்கப்படுகிறது, void ஆக இருக்கலாம்
      } else {
        return "Insufficient funds.";
      }
    },
    getBalance: function() {
      return balance;
    }
  };
}

const account = createBankAccount(1000);

console.log(account.deposit(500)); // வெளியீடு: 1500
console.log(account.withdraw(200)); // வெளியீடு: 1300
console.log(account.getBalance()); // வெளியீடு: 1300

// balance-ஐ நேரடியாக அணுக முயற்சிப்பது வேலை செய்யாது
// console.log(account.balance); // வெளியீடு: undefined

விளக்கம்:

உதாரணம் 3: ஒரு லூப்பில் `setTimeout` உடன் க்ளோஷர்களைப் பயன்படுத்துதல்

லூப்களுக்குள் `setTimeout` போன்ற ஒத்திசைவற்ற செயல்பாடுகளுடன் பணிபுரியும் போது க்ளோஷர்கள் அவசியமானவை. க்ளோஷர்கள் இல்லாமல், ஜாவாஸ்கிரிப்டின் ஒத்திசைவற்ற தன்மையால் எதிர்பாராத நடத்தையை நீங்கள் சந்திக்க நேரிடலாம்.


for (var i = 1; i <= 5; i++) {
  (function(j) {
    setTimeout(function() {
      console.log("Value of i: " + j);
    }, j * 1000);
  })(i);
}

// வெளியீடு:
// Value of i: 1 (1 வினாடிக்குப் பிறகு)
// Value of i: 2 (2 வினாடிகளுக்குப் பிறகு)
// Value of i: 3 (3 வினாடிகளுக்குப் பிறகு)
// Value of i: 4 (4 வினாடிகளுக்குப் பிறகு)
// Value of i: 5 (5 வினாடிகளுக்குப் பிறகு)

விளக்கம்:

லூப்பில் var-க்கு பதிலாக let-ஐப் பயன்படுத்துவதும் இந்த சிக்கலை சரிசெய்யும், ஏனெனில் let ஒவ்வொரு மறு செய்கைக்கும் ஒரு பிளாக் ஸ்கோப்பை உருவாக்குகிறது.


for (let i = 1; i <= 5; i++) {
  setTimeout(function() {
    console.log("Value of i: " + i);
  }, i * 1000);
}

// வெளியீடு (மேலே உள்ளதைப் போலவே):
// Value of i: 1 (1 வினாடிக்குப் பிறகு)
// Value of i: 2 (2 வினாடிகளுக்குப் பிறகு)
// Value of i: 3 (3 வினாடிகளுக்குப் பிறகு)
// Value of i: 4 (4 வினாடிகளுக்குப் பிறகு)
// Value of i: 5 (5 வினாடிகளுக்குப் பிறகு)

உதாரணம் 4: கரியிங் மற்றும் பார்ஷியல் அப்ளிகேஷன்

பல ஆர்கியுமென்ட்களைக் கொண்ட ஃபங்ஷன்களை ஒவ்வொன்றும் ஒற்றை ஆர்கியுமென்டை எடுக்கும் ஃபங்ஷன்களின் வரிசையாக மாற்றப் பயன்படுத்தப்படும் கரியிங் மற்றும் பார்ஷியல் அப்ளிகேஷன் நுட்பங்களுக்கு க்ளோஷர்கள் அடிப்படையானவை.


function multiply(a) {
  return function(b) {
    return function(c) {
      return a * b * c;
    };
  };
}

const multiplyBy5 = multiply(5);
const multiplyBy5And2 = multiplyBy5(2);

console.log(multiplyBy5And2(3)); // வெளியீடு: 30 (5 * 2 * 3)

விளக்கம்:

உதாரணம் 5: மாட்யூல் பேட்டர்ன்

மாட்யூல் பேட்டர்னில் க்ளோஷர்கள் பெரிதும் பயன்படுத்தப்படுகின்றன, இது ஜாவாஸ்கிரிப்ட் குறியீட்டை ஒழுங்கமைக்கவும் கட்டமைக்கவும் உதவுகிறது, மட்டுத்தன்மையை ஊக்குவிக்கிறது மற்றும் பெயரிடல் முரண்பாடுகளைத் தடுக்கிறது.


const myModule = (function() {
  let privateVariable = "வணக்கம், உலகமே!";

  function privateMethod() {
    console.log(privateVariable);
  }

  return {
    publicMethod: function() {
      privateMethod();
    },
    publicProperty: "இது ஒரு பொது சொத்து."
  };
})();

console.log(myModule.publicProperty); // வெளியீடு: இது ஒரு பொது சொத்து.
myModule.publicMethod(); // வெளியீடு: வணக்கம், உலகமே!

// privateVariable அல்லது privateMethod-ஐ நேரடியாக அணுக முயற்சிப்பது வேலை செய்யாது
// console.log(myModule.privateVariable); // வெளியீடு: undefined
// myModule.privateMethod(); // வெளியீடு: TypeError: myModule.privateMethod is not a function

விளக்கம்:

க்ளோஷர்கள் மற்றும் மெமரி மேனேஜ்மென்ட்

க்ளோஷர்கள் சக்திவாய்ந்தவை என்றாலும், மெமரி மேலாண்மையில் அவற்றின் சாத்தியமான தாக்கம் குறித்து எச்சரிக்கையாக இருப்பது முக்கியம். க்ளோஷர்கள் தங்கள் சுற்றியுள்ள ஸ்கோப்பிலிருந்து மாறிகளுக்கான அணுகலைத் தக்க வைத்துக் கொள்வதால், அவை இனி தேவைப்படாத போது அந்த மாறிகள் குப்பை சேகரிக்கப்படுவதைத் தடுக்கலாம். கவனமாகக் கையாளப்படாவிட்டால் இது மெமரி கசிவுகளுக்கு வழிவகுக்கும்.

மெமரி கசிவுகளைத் தவிர்க்க, க்ளோஷர்களுக்குள் உள்ள மாறிகளுக்கான தேவையற்ற குறிப்புகளை இனி தேவைப்படாத போது உடைப்பதை உறுதிப்படுத்தவும். மாறிகளை null என அமைப்பதன் மூலம் அல்லது தேவையற்ற க்ளோஷர்களை உருவாக்குவதைத் தவிர்க்க உங்கள் குறியீட்டை மறுசீரமைப்பதன் மூலம் இதைச் செய்யலாம்.

தவிர்க்க வேண்டிய பொதுவான க்ளோஷர் தவறுகள்

முடிவுரை

ஜாவாஸ்கிரிப்ட் க்ளோஷர்கள் எந்தவொரு ஜாவாஸ்கிரிப்ட் டெவலப்பரும் புரிந்துகொள்ள வேண்டிய ஒரு சக்திவாய்ந்த மற்றும் அத்தியாவசியமான கருத்தாகும். அவை தரவு என்கேப்சுலேஷன், நிலை பாதுகாப்பு, உயர்-நிலை ஃபங்ஷன்கள் மற்றும் ஒத்திசைவற்ற புரோகிராமிங்கை செயல்படுத்துகின்றன. க்ளோஷர்கள் எவ்வாறு செயல்படுகின்றன மற்றும் அவற்றை எவ்வாறு திறம்படப் பயன்படுத்துவது என்பதைப் புரிந்துகொள்வதன் மூலம், நீங்கள் அதிக திறமையான, பராமரிக்கக்கூடிய மற்றும் பாதுகாப்பான குறியீட்டை எழுத முடியும்.

இந்த வழிகாட்டி நடைமுறை உதாரணங்களுடன் க்ளோஷர்களின் விரிவான கண்ணோட்டத்தை வழங்கியுள்ளது. இந்த உதாரணங்களுடன் பயிற்சி மற்றும் பரிசோதனை செய்வதன் மூலம், க்ளோஷர்கள் பற்றிய உங்கள் புரிதலை ஆழப்படுத்தலாம் மற்றும் மேலும் திறமையான ஜாவாஸ்கிரிப்ட் டெவலப்பராக மாறலாம்.

மேலும் கற்க