जावास्क्रिप्ट के इस व्यवहार को hoisting कहा जाता है। एमडीएन (https://developer.mozilla.org/en-US/docs/Glossary/Hoisting) पर एक अच्छी व्याख्या है
जावास्क्रिप्ट में, फ़ंक्शंस और चर हो जाते हैं। होस्टिंग एक स्कोप (वैश्विक दायरा या वर्तमान फ़ंक्शन स्कोप) के शीर्ष पर घोषणाओं को स्थानांतरित करने का जावास्क्रिप्ट का व्यवहार है।
इसका मतलब है कि आप घोषित होने से पहले किसी फ़ंक्शन या चर का उपयोग करने में सक्षम हैं, या दूसरे शब्दों में: किसी फ़ंक्शन या चर को पहले से ही उपयोग किए जाने के बाद घोषित किया जा सकता है।
मूल रूप से, अगर आप इस तरह एक चर घोषित:
console.log(s); // s === undefined
var s = 'some string';
s
घोषणा गुंजाइश की शुरुआत करने के लिए "फहराया" किया जाएगा (अर्थात वहाँ console.log
के साथ लाइन पर कोई ReferenceError
हो जाएगा)। वैरिएबल का मान उस पल में परिभाषित नहीं किया जाएगा हालांकि। एक चर को एक गुमनाम समारोह बताए साथ
ही जाता है, तो:
console.log(f); // f === undefined
f(); // TypeError: f is not a function
var f = function() {}; // assigning an anonymous function as a value
f(); // ok, now it is a function ;)
चर फहराया जाएगा और इस प्रकार पूरे दायरे में दिखाई दे रहा, लेकिन यह मूल्य है, भले ही वह एक समारोह है, होगा अभी भी अपरिभाषित हो - इसलिए यदि आप इसे निष्पादित करने का प्रयास करते हैं तो त्रुटि। ताकि आप इसे भी गुंजाइश आप इसे घोषित किया है की पहली पंक्ति में चला सकते हैं
console.log(f); // f === function f()
f(); // we can already run it
function f() {}; // named function declaration
यह परिभाषा भी फहराया किया जाएगा:
दूसरी ओर यदि आप एक नामित समारोह घोषणा करते हैं।
स्रोत
2015-07-10 08:00:35
[जावास्क्रिप्ट फ़ंक्शन स्कोपिंग और होस्टिंग] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/7506844/javascript-function-scoping-and-hoisting) – DTing
हां। एक [* निष्पादन संदर्भ *] (http://ecma-international.org/ecma-262/6.0/index.html#sec-execution-contexts) दर्ज करने पर, किसी भी कोड को चलाने से पहले सभी फ़ंक्शन और परिवर्तनीय घोषणाएं संसाधित की जाती हैं। – RobG