जावास्क्रिप्ट में hoisting का मतलब है कि स्क्रिप्ट के निष्पादन (execution) से पहले, वेरिएबल डिक्लेरेशन, फंक्शन डिक्लेरेशन, और क्लास डिक्लेरेशन को उनके स्कोप के शीर्ष पर "खिसका" दिया जाता है। हालांकि, सिर्फ डिक्लेरेशन को hoist किया जाता है, इनिशियलाइज़ेशन (Initialization) को नहीं।
Hoisting की विशेषताएँ:
वेरिएबल्स और फंक्शन्स को उनके स्कोप के शीर्ष पर ले जाया जाता है।
इसका प्रभाव यह होता है कि आप किसी वेरिएबल या फंक्शन को उनकी डिक्लेरेशन से पहले भी एक्सेस कर सकते हैं।
वेरिएबल Hoisting:
var वेरिएबल्स को hoist किया जाता है लेकिन उनकी वैल्यू undefined
रहती है:
console.log(myVar); // Output: undefined
var myVar = 10;
ऊपर के कोड को जावास्क्रिप्ट इस तरह से मानती है:
var myVar;
console.log(myVar); // undefined
myVar = 10;
let और const वेरिएबल्स को भी hoist किया जाता है, लेकिन वे "temporal dead zone (TDZ)" में रहते हैं जब तक उनकी डिक्लेरेशन पूरी नहीं होती:
console.log(myVar); // ReferenceError: Cannot access 'myVar' before initialization
let myVar = 10;
फंक्शन Hoisting:
फंक्शन डिक्लेरेशन पूरी तरह hoist होती है:
greet(); // Output: Hello!
function greet() {
console.log('Hello!');
}
लेकिन फंक्शन एक्सप्रेशन और ऐरो फंक्शन पूरी तरह से hoist नहीं होते:
greet(); // TypeError: greet is not a function
var greet = function() {
console.log('Hello!');
};
संक्षेप में:
डिक्लेरेशन hoist होता है, लेकिन इनिशियलाइज़ेशन नहीं।
var
औरlet/const
अलग-अलग तरह से व्यवहार करते हैं।फंक्शन डिक्लेरेशन पूरी तरह से hoist होते हैं, लेकिन फंक्शन एक्सप्रेशन नहीं।
जावास्क्रिप्ट में Hoisting "behind the scenes" काम कैसे करता है, इसे समझने के लिए यह जानना ज़रूरी है कि जावास्क्रिप्ट एक इंटरप्रेटेड लैंग्वेज होने के बावजूद, कोड को दो चरणों में संभालता है:
1. Compilation Phase (कंपाइलेशन चरण):
इस चरण में, जावास्क्रिप्ट इंजन कोड की स्कैनिंग करता है और:
सभी वेरिएबल डिक्लेरेशन्स और फंक्शन डिक्लेरेशन्स को उनके स्कोप के शीर्ष पर ले जाता है (global scope या function scope के अनुसार)।
कोड का यह हिस्सा सिर्फ डिक्लेरेशन को "hoist" करता है, इनिशियलाइज़ेशन नहीं।
उदाहरण:
console.log(a);
var a = 10;
कंपाइलेशन के दौरान:
var a
को hoist किया जाता है और डिफॉल्ट वैल्यूundefined
दी जाती है।कोड ऐसा माना जाता है:
javascriptvar a; console.log(a); // undefined a = 10;
2. Execution Phase (निष्पादन चरण):
इस चरण में, कोड टॉप-डाउन यानी ऊपर से नीचे चलाया जाता है।
जब वेरिएबल या फंक्शन को एक्सेस किया जाता है, तो उनकी इनिशियलाइज़ेशन और वैल्यू का उपयोग होता है।
Hoisting के दौरान क्या होता है?
Variable Hoisting (var): वेरिएबल को डिफॉल्ट वैल्यू
undefined
मिलती है।javascriptconsole.log(x); // undefined var x = 5;
let और const: इन वेरिएबल्स को भी hoist किया जाता है लेकिन वे Temporal Dead Zone (TDZ) में रहते हैं। जब तक कोड उस लाइन तक नहीं पहुंचता जहाँ वे डिक्लेयर किए गए हैं, उनका उपयोग नहीं किया जा सकता।
javascriptconsole.log(y); // ReferenceError let y = 10;
Function Declaration: ये पूरी तरह से hoist किए जाते हैं, इसलिए इन्हें डिक्लेरेशन से पहले भी कॉल किया जा सकता है।
javascriptgreet(); // Output: Hello function greet() { console.log('Hello'); }
Function Expressions और Arrow Functions: ये var वेरिएबल की तरह व्यवहार करते हैं और केवल डिक्लेरेशन होस्ट होती है, इनिशियलाइज़ेशन नहीं।
javascriptgreet(); // TypeError: greet is not a function var greet = function() { console.log('Hello'); };
निष्कर्ष:
Hoisting के दौरान डिक्लेरेशन और स्कोप का प्रबंधन पहले किया जाता है।
Execution Phase में कोड की वास्तविक इनिशियलाइज़ेशन और निष्पादन होता है।
No comments:
Post a Comment