स्क्रीन के पीछे क्या हो रहा है, इसके बारे में मुझे कुछ पुष्टि चाहिए।

एमडीएन में एक लेख है जिसमें कहा गया है कि हमें ब्लॉक-स्तर में कार्यों की घोषणा नहीं करनी चाहिए, जैसे कि एक 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

5
Ooie 29 फरवरी 2020, 10:24
1
देखें / प्रश्न/60416842/… असंगति के उदाहरण के लिए।
 – 
QuentinUK
29 फरवरी 2020, 10:29
4
जावास्क्रिप्ट सिंगल थ्रेडेड है, कोड का मूल्यांकन तब किया जाता है जब इसे निष्पादित किया जाता है, पहले या बाद में नहीं। अगर व्यवहार के रूप में ब्लॉक संगत नहीं है तो बस कार्यों को नहीं घोषित करें। यदि आपको सशर्त रूप से फ़ंक्शन बनाना है, तो फ़ंक्शन एक्सप्रेशन का उपयोग करें।
 – 
RobG
29 फरवरी 2020, 10:38
stackoverflow.com/a/31461615 - प्रासंगिक प्राथमिक प्रश्नों का उत्तर देने लगता है। पता नहीं मुझे इसे पाने के लिए एक निबंध के माध्यम से क्यों पढ़ना पड़ा..
 – 
user2864740
1 मार्च 2020, 04:08

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 संस्करण और स्वयं पर्यावरण का उपयोग कर रहे हैं या नहीं (कार्यान्वयन हमेशा नहीं विनिर्देश के अनुरूप)।

पूर्वानुमेय, आसानी से पढ़े जाने वाले कोड के लिए, गैर-फ़ंक्शन ब्लॉकों में फ़ंक्शन घोषणाओं का कभी भी उपयोग नहीं करना शायद सबसे अच्छा है; केवल फ़ंक्शन घोषणाओं का उपयोग करें जब सीधे फ़ंक्शन ब्लॉक के अंदर हों।

(ध्यान दें कि फ़ंक्शन एक्सप्रेशन, जहां फ़ंक्शन को मान के रूप में उपयोग किया जाता है और किसी चीज़ को पास किया जाता है या तुरंत लागू किया जाता है या एक चर को स्पष्ट रूप से असाइन किया जाता है, फ़ंक्शन घोषणाओं के समान नहीं हैं - फ़ंक्शन एक्सप्रेशन ठीक हैं, यह केवल फ़ंक्शन घोषणाओं का अजीब व्यवहार है जो समस्याग्रस्त है। यह भी ध्यान दें, प्रति टिप्पणी, कि "फ़ंक्शन घोषणा" को कभी-कभी "फ़ंक्शन स्टेटमेंट" कहा जाता है।)

0
Community 20 जून 2020, 12:12
1
फंक्शन कथन if-blocks के अंदर दिखाई देना मुद्दा है। फंक्शन एक्सप्रेशन ठीक हैं। तो अन्य चीजें अच्छी हैं, लेकिन यह वास्तव में कोई फर्क नहीं पड़ता क्योंकि मौलिक अवधारणा कार्यान्वयन के दौरान गलत परिभाषित/असंगत व्यवहार है।
 – 
user2864740
1 मार्च 2020, 03:57
यदि यह ES3/5/6, आदि से बदल गया है, तो इसे विशेष रूप से संबोधित किया जाना चाहिए, जैसा कि ओपी ने अनुरोध किया था।
 – 
user2864740
1 मार्च 2020, 04:03
1
मैंने पहले ही कहा था गैर-फ़ंक्शन ब्लॉक में कभी भी फ़ंक्शन घोषणाओं का उपयोग न करें; केवल फ़ंक्शन घोषणाओं का उपयोग तब करें जब सीधे फ़ंक्शन ब्लॉक के अंदर हों।
 – 
CertainPerformance
1 मार्च 2020, 04:53
यदि आप शब्दों के बारे में उलझन में हैं, जिसे मैंने "फ़ंक्शन डिक्लेरेशन" कहा है, वह उसी चीज़ की तरह लगता है जिसे आप "फ़ंक्शन स्टेटमेंट" से संदर्भित कर रहे हैं - वे दोनों function fnName() { ... संरचनाएं हैं जो किसी अन्य से जुड़ी नहीं हैं अभिव्यक्ति
 – 
CertainPerformance
1 मार्च 2020, 04:56