स्क्रीन के पीछे क्या हो रहा है, इसके बारे में मुझे कुछ पुष्टि चाहिए।
एमडीएन में एक लेख है जिसमें कहा गया है कि हमें ब्लॉक-स्तर में कार्यों की घोषणा नहीं करनी चाहिए, जैसे कि एक if-statement के अंदर। क्योंकि यह पूरे ब्राउज़र में असंगत है और प्री-ईएस2015 (या प्री-ईएस6) से इसका कोई लेना-देना नहीं है।
इफ-स्टेटमेंट के अंदर का फंक्शन तब तक नहीं बनाया जाएगा जब तक कि कंडीशन सही न हो।
मैं सोच रहा था, अगर शर्त सही है, मान लें कि 5 मिनट बाद जावास्क्रिप्ट लोड होने और सिंक्रोनाइज़ करने के बाद, यह फ़ंक्शन को क्या बनाएगा? क्या यह अभी भी फ़ंक्शन बनाने के लिए कोड की स्मृति है, या इसे अप्रयुक्त कोड और सभी में डंप किया गया है?
मैं जानना चाहता हूं कि अगर-स्टेटमेंट पूरा होने के बाद भी फ़ंक्शन अभी भी मौजूद है या नहीं। क्या यह सुलभ है? यह कब तक सुलभ है? क्या यह तब तक सुलभ है जब तक कि शर्त गलत न हो? क्या परिणाम ES6 और पूर्व-ES6 से भिन्न है? मैंने सुना है कि if-statement में पूर्व-ES6 की कोई गुंजाइश नहीं है।
जैसे
if (condition) {
function foo() {console.log(“hello world”);
}
}
एमडीएन में 'गैर-सख्त कोड में ब्लॉक-स्तरीय फ़ंक्शंस' के तहत 'फ़ंक्शंस' पर एक लेख पढ़ने के बाद मैं उलझन में था: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions
1 उत्तर
यदि शर्त सही है, मान लें कि जावास्क्रिप्ट लोड होने और सिंक्रोनाइज़ करने के 5 मिनट बाद, क्या यह फ़ंक्शन बनाएगा?
जैसे ही if
चलेगा, फ़ंक्शन तुरंत बनाया जाएगा।
क्या यह अभी भी फ़ंक्शन बनाने के लिए कोड की स्मृति है, या इसे अप्रयुक्त कोड और सभी में डंप किया गया है?
मैं जानना चाहता हूं कि अगर-स्टेटमेंट पूरा होने के बाद भी फ़ंक्शन अभी भी मौजूद है या नहीं। क्या यह सुलभ है? यह कब तक सुलभ है?
यह व्यवहार समान होगा, भले ही फ़ंक्शन को if
ब्लॉक में घोषित किया गया हो या नहीं: यदि भविष्य में कुछ भी संभवतः फ़ंक्शन को संदर्भित नहीं कर सकता है (उदाहरण के लिए, यदि ब्लॉक समाप्त होता है और ब्लॉक के अंदर कुछ भी संदर्भ नहीं है समारोह के लिए), यह अंततः कचरा एकत्र किया जाएगा। जीसी चलने तक फ़ंक्शन अभी भी स्मृति में "मौजूद" हो सकता है।
उदाहरण के लिए, यह स्पष्ट होना चाहिए कि निम्न फ़ंक्शन हमेशा मौजूद रहना चाहिए, कम से कम जब तक आप पृष्ठ को पुनः लोड नहीं करते:
// IIFE, to get off the top level
(() => {
if (true) {
function foo() {
console.log('clicked');
}
window.addEventListener('click', foo);
}
})();
ऐसा इसलिए है क्योंकि addEventListener
को फ़ंक्शन का संदर्भ दिया गया है।
लेकिन निम्न foo
फ़ंक्शन को GC'd मिलेगा (शायद पेज लोड होने के बाद एक या कुछ सेकंड - यह अंतर्निहित इंजन पर निर्भर करता है, और जावास्क्रिप्ट के लिए दृश्यमान नहीं है):
// IIFE, to get off the top level
(() => {
if (true) {
function foo() {
console.log('clicked');
}
}
})();
यदि उस समय तक फ़ंक्शन के संदर्भ में कुछ भी सहेजा नहीं गया है जो चर को स्कोप करने वाला ब्लॉक समाप्त हो गया है, तो फ़ंक्शन कहीं भी पहुंच योग्य नहीं होगा, और जीसीडी होगा।
शेष प्रश्न अनिवार्य रूप से वही दिखता है: "फ़ंक्शन को संदर्भित किया जा सकता है", जिसे बर्गी के उत्तर यहांमें सबसे अच्छा वर्णित किया गया है। ए>। यह थोड़ा जटिल है, और व्यवहार इस बात पर निर्भर करता है कि आप सख्त मोड, पर्यावरण के ES संस्करण और स्वयं पर्यावरण का उपयोग कर रहे हैं या नहीं (कार्यान्वयन हमेशा नहीं विनिर्देश के अनुरूप)।
पूर्वानुमेय, आसानी से पढ़े जाने वाले कोड के लिए, गैर-फ़ंक्शन ब्लॉकों में फ़ंक्शन घोषणाओं का कभी भी उपयोग नहीं करना शायद सबसे अच्छा है; केवल फ़ंक्शन घोषणाओं का उपयोग करें जब सीधे फ़ंक्शन ब्लॉक के अंदर हों।
(ध्यान दें कि फ़ंक्शन एक्सप्रेशन, जहां फ़ंक्शन को मान के रूप में उपयोग किया जाता है और किसी चीज़ को पास किया जाता है या तुरंत लागू किया जाता है या एक चर को स्पष्ट रूप से असाइन किया जाता है, फ़ंक्शन घोषणाओं के समान नहीं हैं - फ़ंक्शन एक्सप्रेशन ठीक हैं, यह केवल फ़ंक्शन घोषणाओं का अजीब व्यवहार है जो समस्याग्रस्त है। यह भी ध्यान दें, प्रति टिप्पणी, कि "फ़ंक्शन घोषणा" को कभी-कभी "फ़ंक्शन स्टेटमेंट" कहा जाता है।)
function fnName() { ...
संरचनाएं हैं जो किसी अन्य से जुड़ी नहीं हैं अभिव्यक्ति