tl; dr यदि आप सब कुछ लोड होने तक कुछ भी नहीं कह रहे हैं, तो आपको ठीक होना चाहिए।
संपादित करें: एक सिंहावलोकन जो भी कुछ ES6 घोषणाओं (को शामिल किया गया के लिए let
, const
): https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Scope_Cheatsheet
यह अजीब व्यवहार पर निर्भर करता है
- आप कार्यों को कैसे परिभाषित करते हैं और
- जब आप उन्हें बुलाते हैं।
यहाँ कुछ उदाहरण हैं।
bar(); //This won't throw an error
function bar() {}
foo(); //This will throw an error
var foo = function() {}
bar();
function bar() {
foo(); //This will throw an error
}
var foo = function() {}
bar();
function bar() {
foo(); //This _won't_ throw an error
}
function foo() {}
function bar() {
foo(); //no error
}
var foo = function() {}
bar();
इसकी वजह है किसी चीज को फहराना !
फ़ंक्शन को परिभाषित करने के दो तरीके हैं: फ़ंक्शन घोषणा और फ़ंक्शन अभिव्यक्ति । अंतर कष्टप्रद और मिनट है, तो चलिए इसे थोड़ा गलत कहते हैं: यदि आप इसे पसंद कर रहे हैं function name() {}
, तो यह एक घोषणा है , और जब आप इसे लिखते हैं var name = function() {}
(या किसी अनाम फ़ंक्शन को किसी रिटर्न को सौंपा जाता है, जैसी चीजें), यह एक समारोह अभिव्यक्ति ।
सबसे पहले, आइए देखें कि चर कैसे संभाले जाते हैं:
var foo = 42;
//the interpreter turns it into this:
var foo;
foo = 42;
अब, फ़ंक्शन घोषणाओं को कैसे नियंत्रित किया जाता है:
var foo = 42;
function bar() {}
//turns into
var foo; //Insanity! It's now at the top
function bar() {}
foo = 42;
var
बयान "फेंकता है" निर्माण की foo
बहुत शीर्ष करने के लिए, लेकिन अभी तक यह करने के लिए मान असाइन नहीं करता है। फ़ंक्शन की घोषणा रेखा के बगल में आती है, और अंत में एक मान असाइन किया जाता है foo
।
और इस बारे में क्या?
bar();
var foo = 42;
function bar() {}
//=>
var foo;
function bar() {}
bar();
foo = 42;
केवल घोषणा की foo
शीर्ष करने के लिए ले जाया जाता है। कॉल bar
किए जाने के बाद ही असाइनमेंट आता है, जहां यह सभी उत्थापन से पहले था।
और अंत में, सहमति के लिए:
bar();
function bar() {}
//turns to
function bar() {}
bar();
अब, फ़ंक्शन अभिव्यक्तियों के बारे में क्या ?
var foo = function() {}
foo();
//=>
var foo;
foo = function() {}
foo();
बस नियमित रूप से चर की तरह, पहली foo
है घोषित दायरे से उच्चतम बिंदु पर है, तो यह एक मूल्य असाइन किया गया है।
आइए देखें कि दूसरा उदाहरण एक त्रुटि क्यों फेंकता है।
bar();
function bar() {
foo();
}
var foo = function() {}
//=>
var foo;
function bar() {
foo();
}
bar();
foo = function() {}
जैसा कि हमने पहले देखा है, केवल बनाने foo
को फहराया जाता है, असाइनमेंट आता है जहां यह "मूल" (अन-होवर्ड) कोड में दिखाई देता है। जब bar
कहा जाता है, इससे पहले कि foo
यह एक मूल्य सौंपा है, इसलिए foo === undefined
। अब फंक्शन-बॉडी में bar
, ऐसा लगता है जैसे आप कर रहे हैं undefined()
, जो एक त्रुटि फेंकता है।