ಕನ್ನಡ

ಪ್ರಾಯೋಗಿಕ ಉದಾಹರಣೆಗಳ ಮೂಲಕ ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಕ್ಲೋಷರ್‌ಗಳನ್ನು ಅನ್ವೇಷಿಸಿ, ಅವು ಹೇಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತವೆ ಮತ್ತು ಸಾಫ್ಟ್‌ವೇರ್ ಅಭಿವೃದ್ಧಿಯಲ್ಲಿ ಅವುಗಳ ನೈಜ-ಪ್ರಪಂಚದ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳಿ.

ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಕ್ಲೋಷರ್‌ಗಳು: ಪ್ರಾಯೋಗಿಕ ಉದಾಹರಣೆಗಳೊಂದಿಗೆ ನಿಗೂಢತೆಯನ್ನು ಭೇದಿಸುವುದು

ಕ್ಲೋಷರ್‌ಗಳು ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್‌ನಲ್ಲಿ ಒಂದು ಮೂಲಭೂತ ಪರಿಕಲ್ಪನೆಯಾಗಿದ್ದು, ಇದು ಎಲ್ಲಾ ಹಂತದ ಡೆವಲಪರ್‌ಗಳಿಗೆ ಗೊಂದಲವನ್ನುಂಟುಮಾಡುತ್ತದೆ. ದಕ್ಷ, ನಿರ್ವಹಿಸಬಲ್ಲ, ಮತ್ತು ಸುರಕ್ಷಿತ ಕೋಡ್ ಬರೆಯಲು ಕ್ಲೋಷರ್‌ಗಳನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳುವುದು ಬಹಳ ಮುಖ್ಯ. ಈ ಸಮಗ್ರ ಮಾರ್ಗದರ್ಶಿ ಪ್ರಾಯೋಗಿಕ ಉದಾಹರಣೆಗಳೊಂದಿಗೆ ಕ್ಲೋಷರ್‌ಗಳನ್ನು ನಿಗೂಢತೆಯಿಂದ ಹೊರತಂದು ಅವುಗಳ ನೈಜ-ಪ್ರಪಂಚದ ಅನ್ವಯಗಳನ್ನು ಪ್ರದರ್ಶಿಸುತ್ತದೆ.

ಕ್ಲೋಷರ್ ಎಂದರೇನು?

ಸರಳವಾಗಿ ಹೇಳುವುದಾದರೆ, ಕ್ಲೋಷರ್ ಎಂದರೆ ಒಂದು ಫಂಕ್ಷನ್ ಮತ್ತು ಆ ಫಂಕ್ಷನ್ ಅನ್ನು ಘೋಷಿಸಿದ ಲೆಕ್ಸಿಕಲ್ ಪರಿಸರದ ಸಂಯೋಜನೆಯಾಗಿದೆ. ಇದರರ್ಥ, ಹೊರಗಿನ ಫಂಕ್ಷನ್ ಕಾರ್ಯಗತಗೊಂಡು ಮುಗಿದ ನಂತರವೂ, ಒಂದು ಕ್ಲೋಷರ್ ತನ್ನ ಸುತ್ತಮುತ್ತಲಿನ ಸ್ಕೋಪ್‌ನಿಂದ ವೇರಿಯಬಲ್‌ಗಳನ್ನು ಪ್ರವೇಶಿಸಲು ಫಂಕ್ಷನ್‌ಗೆ ಅನುಮತಿಸುತ್ತದೆ. ಇದನ್ನು ಒಳಗಿನ ಫಂಕ್ಷನ್ ತನ್ನ ಪರಿಸರವನ್ನು "ನೆನಪಿನಲ್ಲಿಟ್ಟುಕೊಳ್ಳುವುದು" ಎಂದು ಭಾವಿಸಬಹುದು.

ಇದನ್ನು ನಿಜವಾಗಿಯೂ ಅರ್ಥಮಾಡಿಕೊಳ್ಳಲು, ಪ್ರಮುಖ ಅಂಶಗಳನ್ನು ವಿಭಜಿಸೋಣ:

ಹೊರಗಿನ ಫಂಕ್ಷನ್ ಹಿಂತಿರುಗಿದ ನಂತರವೂ ಒಳಗಿನ ಫಂಕ್ಷನ್ ತನ್ನ ಲೆಕ್ಸಿಕಲ್ ಸ್ಕೋಪ್‌ನಲ್ಲಿರುವ ವೇರಿಯಬಲ್‌ಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ಉಳಿಸಿಕೊಳ್ಳುವುದರಿಂದ ಈ ಮ್ಯಾಜಿಕ್ ನಡೆಯುತ್ತದೆ. ಈ ವರ್ತನೆಯು ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಸ್ಕೋಪ್ ಮತ್ತು ಮೆಮೊರಿ ನಿರ್ವಹಣೆಯನ್ನು ಹೇಗೆ ನಿಭಾಯಿಸುತ್ತದೆ ಎಂಬುದರ ಪ್ರಮುಖ ಭಾಗವಾಗಿದೆ.

ಕ್ಲೋಷರ್‌ಗಳು ಏಕೆ ಮುಖ್ಯ?

ಕ್ಲೋಷರ್‌ಗಳು ಕೇವಲ ಒಂದು ಸೈದ್ಧಾಂತಿಕ ಪರಿಕಲ್ಪನೆಯಲ್ಲ; ಅವು ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್‌ನಲ್ಲಿನ ಅನೇಕ ಸಾಮಾನ್ಯ ಪ್ರೋಗ್ರಾಮಿಂಗ್ ಮಾದರಿಗಳಿಗೆ ಅತ್ಯಗತ್ಯ. ಅವು ಈ ಕೆಳಗಿನ ಪ್ರಯೋಜನಗಳನ್ನು ಒದಗಿಸುತ್ತವೆ:

ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಕ್ಲೋಷರ್‌ಗಳ ಪ್ರಾಯೋಗಿಕ ಉದಾಹರಣೆಗಳು

ಕ್ಲೋಷರ್‌ಗಳು ಹೇಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತವೆ ಮತ್ತು ಅವುಗಳನ್ನು ನೈಜ-ಪ್ರಪಂಚದ ಸನ್ನಿವೇಶಗಳಲ್ಲಿ ಹೇಗೆ ಬಳಸಬಹುದು ಎಂಬುದನ್ನು ವಿವರಿಸಲು ಕೆಲವು ಪ್ರಾಯೋಗಿಕ ಉದಾಹರಣೆಗಳನ್ನು ನೋಡೋಣ.

ಉದಾಹರಣೆ 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; // ಪ್ರದರ್ಶನಕ್ಕಾಗಿ ಹಿಂತಿರುಗಿಸಲಾಗುತ್ತಿದೆ, ವಾಯ್ಡ್ ಆಗಿರಬಹುದು
    },
    withdraw: function(amount) {
      if (amount <= balance) {
        balance -= amount;
        return balance; // ಪ್ರದರ್ಶನಕ್ಕಾಗಿ ಹಿಂತಿರುಗಿಸಲಾಗುತ್ತಿದೆ, ವಾಯ್ಡ್ ಆಗಿರಬಹುದು
      } 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

// ಬ್ಯಾಲೆನ್ಸ್ ಅನ್ನು ನೇರವಾಗಿ ಪ್ರವೇಶಿಸಲು ಪ್ರಯತ್ನಿಸಿದರೆ ಕೆಲಸ ಮಾಡುವುದಿಲ್ಲ
// 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);
}

// ಔಟ್‌ಪುಟ್:
// i ನ ಮೌಲ್ಯ: 1 (1 ಸೆಕೆಂಡಿನ ನಂತರ)
// i ನ ಮೌಲ್ಯ: 2 (2 ಸೆಕೆಂಡುಗಳ ನಂತರ)
// i ನ ಮೌಲ್ಯ: 3 (3 ಸೆಕೆಂಡುಗಳ ನಂತರ)
// i ನ ಮೌಲ್ಯ: 4 (4 ಸೆಕೆಂಡುಗಳ ನಂತರ)
// i ನ ಮೌಲ್ಯ: 5 (5 ಸೆಕೆಂಡುಗಳ ನಂತರ)

ವಿವರಣೆ:

ಲೂಪ್‌ನಲ್ಲಿ var ಬದಲಿಗೆ let ಅನ್ನು ಬಳಸುವುದರಿಂದ ಈ ಸಮಸ್ಯೆಯನ್ನು ಸರಿಪಡಿಸಬಹುದು, ಏಕೆಂದರೆ let ಪ್ರತಿ ಪುನರಾವರ್ತನೆಗೆ ಬ್ಲಾಕ್ ಸ್ಕೋಪ್ ಅನ್ನು ರಚಿಸುತ್ತದೆ.


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

// ಔಟ್‌ಪುಟ್ (ಮೇಲಿನಂತೆಯೇ):
// i ನ ಮೌಲ್ಯ: 1 (1 ಸೆಕೆಂಡಿನ ನಂತರ)
// i ನ ಮೌಲ್ಯ: 2 (2 ಸೆಕೆಂಡುಗಳ ನಂತರ)
// i ನ ಮೌಲ್ಯ: 3 (3 ಸೆಕೆಂಡುಗಳ ನಂತರ)
// i ನ ಮೌಲ್ಯ: 4 (4 ಸೆಕೆಂಡುಗಳ ನಂತರ)
// 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 = "Hello, world!";

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

  return {
    publicMethod: function() {
      privateMethod();
    },
    publicProperty: "This is a public property."
  };
})();

console.log(myModule.publicProperty); // ಔಟ್‌ಪುಟ್: This is a public property.
myModule.publicMethod(); // ಔಟ್‌ಪುಟ್: Hello, world!

// privateVariable ಅಥವಾ privateMethod ಅನ್ನು ನೇರವಾಗಿ ಪ್ರವೇಶಿಸಲು ಪ್ರಯತ್ನಿಸಿದರೆ ಕೆಲಸ ಮಾಡುವುದಿಲ್ಲ
// console.log(myModule.privateVariable); // ಔಟ್‌ಪುಟ್: undefined
// myModule.privateMethod(); // ಔಟ್‌ಪುಟ್: TypeError: myModule.privateMethod is not a function

ವಿವರಣೆ:

ಕ್ಲೋಷರ್‌ಗಳು ಮತ್ತು ಮೆಮೊರಿ ನಿರ್ವಹಣೆ

ಕ್ಲೋಷರ್‌ಗಳು ಶಕ್ತಿಯುತವಾಗಿದ್ದರೂ, ಮೆಮೊರಿ ನಿರ್ವಹಣೆಯ ಮೇಲೆ ಅವುಗಳ ಸಂಭಾವ್ಯ ಪ್ರಭಾವದ ಬಗ್ಗೆ ತಿಳಿದಿರುವುದು ಮುಖ್ಯ. ಕ್ಲೋಷರ್‌ಗಳು ತಮ್ಮ ಸುತ್ತಮುತ್ತಲಿನ ಸ್ಕೋಪ್‌ನಿಂದ ವೇರಿಯಬಲ್‌ಗಳಿಗೆ ಪ್ರವೇಶವನ್ನು ಉಳಿಸಿಕೊಳ್ಳುವುದರಿಂದ, ಅವುಗಳು ಇನ್ನು ಮುಂದೆ ಅಗತ್ಯವಿಲ್ಲದಿದ್ದರೂ ಆ ವೇರಿಯಬಲ್‌ಗಳನ್ನು ಗಾರ್ಬೇಜ್ ಕಲೆಕ್ಟ್ ಮಾಡುವುದನ್ನು ತಡೆಯಬಹುದು. ಇದನ್ನು ಎಚ್ಚರಿಕೆಯಿಂದ ನಿರ್ವಹಿಸದಿದ್ದರೆ ಇದು ಮೆಮೊರಿ ಸೋರಿಕೆಗೆ ಕಾರಣವಾಗಬಹುದು.

ಮೆಮೊರಿ ಸೋರಿಕೆಯನ್ನು ತಪ್ಪಿಸಲು, ಕ್ಲೋಷರ್‌ಗಳೊಳಗಿನ ವೇರಿಯಬಲ್‌ಗಳಿಗೆ ಅನಗತ್ಯ ಉಲ್ಲೇಖಗಳು ಇನ್ನು ಮುಂದೆ ಅಗತ್ಯವಿಲ್ಲದಿದ್ದಾಗ ಅವುಗಳನ್ನು ತೆಗೆದುಹಾಕುವುದನ್ನು ಖಚಿತಪಡಿಸಿಕೊಳ್ಳಿ. ವೇರಿಯಬಲ್‌ಗಳನ್ನು null ಗೆ ಹೊಂದಿಸುವ ಮೂಲಕ ಅಥವಾ ಅನಗತ್ಯ ಕ್ಲೋಷರ್‌ಗಳನ್ನು ರಚಿಸುವುದನ್ನು ತಪ್ಪಿಸಲು ನಿಮ್ಮ ಕೋಡ್ ಅನ್ನು ಪುನರ್ರಚಿಸುವ ಮೂಲಕ ಇದನ್ನು ಮಾಡಬಹುದು.

ತಪ್ಪಿಸಬೇಕಾದ ಸಾಮಾನ್ಯ ಕ್ಲೋಷರ್ ತಪ್ಪುಗಳು

ತೀರ್ಮಾನ

ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಕ್ಲೋಷರ್‌ಗಳು ಯಾವುದೇ ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಡೆವಲಪರ್ ಅರ್ಥಮಾಡಿಕೊಳ್ಳಬೇಕಾದ ಒಂದು ಶಕ್ತಿಯುತ ಮತ್ತು ಅತ್ಯಗತ್ಯ ಪರಿಕಲ್ಪನೆಯಾಗಿದೆ. ಅವು ಡೇಟಾ ಎನ್‌ಕ್ಯಾಪ್ಸುಲೇಶನ್, ಸ್ಥಿತಿ ಸಂರಕ್ಷಣೆ, ಹೈಯರ್-ಆರ್ಡರ್ ಫಂಕ್ಷನ್‌ಗಳು ಮತ್ತು ಅಸಿಂಕ್ರೋನಸ್ ಪ್ರೋಗ್ರಾಮಿಂಗ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸುತ್ತವೆ. ಕ್ಲೋಷರ್‌ಗಳು ಹೇಗೆ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತವೆ ಮತ್ತು ಅವುಗಳನ್ನು ಪರಿಣಾಮಕಾರಿಯಾಗಿ ಹೇಗೆ ಬಳಸುವುದು ಎಂಬುದನ್ನು ಅರ್ಥಮಾಡಿಕೊಳ್ಳುವ ಮೂಲಕ, ನೀವು ಹೆಚ್ಚು ದಕ್ಷ, ನಿರ್ವಹಿಸಬಲ್ಲ ಮತ್ತು ಸುರಕ್ಷಿತ ಕೋಡ್ ಅನ್ನು ಬರೆಯಬಹುದು.

ಈ ಮಾರ್ಗದರ್ಶಿ ಪ್ರಾಯೋಗಿಕ ಉದಾಹರಣೆಗಳೊಂದಿಗೆ ಕ್ಲೋಷರ್‌ಗಳ ಸಮಗ್ರ ಅವಲೋಕನವನ್ನು ಒದಗಿಸಿದೆ. ಈ ಉದಾಹರಣೆಗಳೊಂದಿಗೆ ಅಭ್ಯಾಸ ಮತ್ತು ಪ್ರಯೋಗ ಮಾಡುವ ಮೂಲಕ, ನೀವು ಕ್ಲೋಷರ್‌ಗಳ ಬಗ್ಗೆ ನಿಮ್ಮ ತಿಳುವಳಿಕೆಯನ್ನು ಇನ್ನಷ್ಟು ಆಳವಾಗಿಸಬಹುದು ಮತ್ತು ಹೆಚ್ಚು ಪ್ರವೀಣ ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ಡೆವಲಪರ್ ಆಗಬಹುದು.

ಹೆಚ್ಚಿನ ಕಲಿಕೆ