← Back to JavaScript Course | Chapter 6: Functions Advanced | Lesson 1 of 8

JS क्लोज़र्स

एक closure एक ऐसा function है जो उन variables को याद रखता है जहाँ वह बनाया गया था, जैसे एक backpack जिसे वह हर जगह साथ ले जाता है। यह outer function के खत्म होने के बाद भी उन्हें इस्तेमाल करते रहता है।
Syntax
javascript
function outer() {
  let outerVariable = value;
  return function inner() {
    return outerVariable;
  };
}
const closure = outer();

Closure क्या है?

एक closure तब होता है जब कोई function अपने outer scope के variables को याद रखता है। inner function बाद में उन variables को इस्तेमाल कर सकता है।

यह इसलिए संभव है क्योंकि JavaScript functions अपने enclosing scope का एक live reference रखते हैं, उसका कोई snapshot नहीं, इसलिए वे variables तब तक बने रहते हैं जब तक closure बना रहता है।

उदाहरण: What Is a Closure?

javascript
function outer() {
  const message = "Hello";
  function inner() {
    console.log(message); // remembers outer's variable
  }
  return inner;
}
const greet = outer();
greet();

Private Data

Closures data को private रख सकते हैं। closure के बाहर का code hidden variable को सीधे access नहीं कर सकता।

यह किसी counter जैसी चीज़ें बनाने का एक आम तरीका है जो सही ढंग से increment होता है भले ही कोई दूसरा code उसकी internal count को सीधे पढ़ या overwrite न कर सके।

उदाहरण: Private Data

javascript
function makeCounter() {
  let count = 0; // private, not accessible outside
  return function () {
    count++;
    return count;
  };
}
const counter = makeCounter();
console.log(counter());
console.log(counter());

Parameters के साथ Closures

हर call एक अलग closure बना सकती है। stored values को साझा होने की ज़रूरत नहीं है। चूंकि हर function call को अपना खुद का execution context मिलता है, एक closure return करने वाला factory function independent, एक-दूसरे में दखल न देने वाले instances बनाता है।

उदाहरण: Closures With Parameters

javascript
function makeMultiplier(factor) {
  return (n) => n * factor;
}
const double = makeMultiplier(2);
const triple = makeMultiplier(3);
console.log(double(5), triple(5)); // independent closures

Practical इस्तेमाल

Closures counters, factories, और ऐसे functions के लिए उपयोगी हैं जिन्हें याद रखी गई settings चाहिए।

एक closure जो किसी database connection या API key को capture करता है, उदाहरण के लिए, आपको हर call पर वह configuration दोबारा पास किए बिना एक साफ function API expose करने देता है।

उदाहरण: Practical Use

javascript
// Define the function `createApiClient` taking `apiKey`
// Define the function `createApiClient` taking `apiKey`
function createApiClient(apiKey) {
  // Return `function fetchData() {` from this function
  // Return `function fetchData() {` from this function
  return function fetchData() {
    // Print `"Using key:", apiKey` to the console
    // Print `"Using key:", apiKey` to the console
    console.log("Using key:", apiKey);
  };
}
// Declare the constant `client`, set to `createApiClient("secret123")`
// Declare the constant `client`, set to `createApiClient("secret123")`
const client = createApiClient("secret123");
// Call `client()`
// Call `client()`
client();

Practice

ऐसे closures बनाने की कोशिश करें जो कोई number या नाम याद रखें। एक makeCounter() function लिखने की कोशिश करें जो increment/decrement functions return करे जो एक hidden counter variable साझा करते हों।

उदाहरण: Practice

javascript
// Define the function `makeCounter` with no parameters
// Define the function `makeCounter` with no parameters
function makeCounter() {
  // Declare the variable `count`, set to `0`
  // Declare the variable `count`, set to `0`
  let count = 0;
  // Return `{` from this function
  // Return `{` from this function
  return {
    increment: () => ++count,
    decrement: () => --count,
  };
}
// Declare the constant `c`, set to `makeCounter()`
// Declare the constant `c`, set to `makeCounter()`
const c = makeCounter();
// Print `c.increment(), c.increment(), c.decrement()` to the console
// Print `c.increment(), c.increment(), c.decrement()` to the console
console.log(c.increment(), c.increment(), c.decrement());
Live Example
Related Topics
{# common_mistakes/chapter_summary/browser_support: on Hindi pages the view already swaps in the hi_ translation fields (or blanks these out if untranslated), so this renders correctly for both languages without a lang_code check here. #}
आम गलतियां
  1. किसी var loop में closures बनाना और उम्मीद करना कि हर एक अपना खुद का number रखेगा, जबकि वे सभी same variable share करते हैं; let इस्तेमाल करें।
  2. किसी closure में बड़े objects रखना, जो memory को free होने से रोकता है।
  3. outer function को हर बार कॉल करना और state के persist होने की उम्मीद करना, जबकि हर call एक नया अलग closure बनाता है।
🔒

Chapter Quiz — Complete all 8 topics to unlock

0/8 topics done

Complete these topics first:

Login to run this code

C/C++/Java/PHP execution requires a free account. Your code is saved — you'll land right back in the editor after logging in.