मुझे माफ कर दो अगर यह एक बिंदु को जोड़ने के लिए गलत तरीका है। मैं यहाँ बहुत नहीं रहा, और रचनात्मक दिशा और / या आलोचना का स्वागत करूँगा।
बेंजामिन का जवाब ओपी के सवाल को बहुत ही शानदार तरीके से संबोधित करता है, लेकिन मैं एक ऐसा ट्विस्ट जोड़ना चाहूंगा जो हमें फहराने और उसकी विषमताओं का पूरा दौरा देगा।
यदि हम कॉल के साथ मूल कोड शुरू करते हैं f, जैसे:
f();
var f = function() {
console.log("Me original.");
};
function f() {
console.log("Me duplicate.");
}
f();
आउटपुट तब होगा:
Me duplicate.
Me original.
कारण यह है कि var और functionबयानों को थोड़े अलग तरीके से फहराया जाता है।
के लिए घोषणा वर्तमान क्षेत्र * के शीर्ष, लेकिन किसी भी करने के लिए ले जाया जाता है कामvar फहराया नहीं है। जहां तक घोषित संस्करण का मूल्य है, यह तब तक अपरिभाषित है जब तक कि मूल असाइनमेंट लाइन नहीं पहुंच जाती।
के लिए functionबयान , दोनों घोषणा और परिभाषा फहराया जाता है। फंक्शन एक्सप्रेशंस , जैसा कि इसमें इस्तेमाल किया गया हैvar f = function() {... निर्माण , फहराया नहीं जाता है।
तो फहराने के बाद, निष्पादन इस तरह है जैसे कि कोड थे:
var f; // declares var f, but does not assign it.
// name and define function f, shadowing the variable
function f() {
console.log("Me duplicate.");
}
// call the currently defined function f
f();
// assigns the result of a function expression to the var f,
// which shadows the hoisted function definition once past this point lexically
f = function() {
console.log("Me original.");
}
// calls the function referenced by the var f
f();
* सभी जावास्क्रिप्ट स्कोप लेक्सिकल, या फंक्शन, स्कोप है, लेकिन ऐसा लगता था कि यह उस समय f शब्द का उपयोग करने के लिए चीजों को भ्रमित करेगा।