नेस्टेड फ़ंक्शन पहेली में जावास्क्रिप्ट "यह" पॉइंटर
एक वेब विकास परिदृश्य में, नेस्टेड फ़ंक्शन के भीतर "यह" पॉइंटर का व्यवहार हैरान करने वाला हो सकता है. निम्नलिखित कोड पर विचार करें:
var std_obj = { options: {rows: 0, cols: 0}, activeEffect: "none", displayMe: function() { // this refers to std_obj if (this.activeEffect == "fade") {} var doSomeEffects = function() { // this surprisingly refers to window object if (this.activeEffect == "fade") {} } doSomeEffects(); } }; std_obj.displayMe();
उपरोक्त कोड में, नेस्टेड फ़ंक्शन "doSomeEffects()" के अंदर "यह" पॉइंटर अप्रत्याशित रूप से "विंडो" ऑब्जेक्ट को इंगित करता है। यह व्यवहार इस अपेक्षा का खंडन करता है कि नेस्टेड फ़ंक्शन बाहरी फ़ंक्शन के दायरे को प्राप्त करेगा, जहां "यह" "std_obj" को संदर्भित करता है।
जावास्क्रिप्ट फ़ंक्शन आमंत्रण और स्कोप को समझना
जावास्क्रिप्ट फ़ंक्शंस में "यह" का व्यवहार इस बात पर निर्भर करता है कि फ़ंक्शन को कैसे लागू किया जाता है। आम तौर पर, तीन तरीके होते हैं:
इन सभी आह्वानों में, "यह" वस्तु "someThing" होगी। हालाँकि, किसी अग्रणी मूल ऑब्जेक्ट (उदाहरण के लिए, उदाहरण में doSomeEffects()) के बिना किसी फ़ंक्शन को लागू करने पर आम तौर पर "यह" ऑब्जेक्ट वैश्विक ऑब्जेक्ट पर सेट हो जाएगा, जो कि अधिकांश ब्राउज़रों में "विंडो" ऑब्जेक्ट है।
उदाहरण कोड में, नेस्टेड फ़ंक्शन "doSomeEffects()" को मूल ऑब्जेक्ट के बिना लागू किया जाता है, इसलिए यह वैश्विक दायरा प्राप्त करता है और इसका "यह" पॉइंटर "विंडो" ऑब्जेक्ट को इंगित करता है। यही कारण है कि आप अप्रत्याशित व्यवहार देखते हैं।
यह सुनिश्चित करने के लिए कि नेस्टेड फ़ंक्शन की "std_obj" दायरे तक पहुंच है, आप इसे "std_obj" ऑब्जेक्ट के साथ Function.call() विधि का उपयोग करके शुरू कर सकते हैं। पहला तर्क:
var doSomeEffects = function() { // this now refers to std_obj if (this.activeEffect == "fade") {} } doSomeEffects.call(std_obj);
जावास्क्रिप्ट में "इस" सूचक व्यवहार की सूक्ष्म बारीकियों को समझना मजबूत और रखरखाव योग्य अनुप्रयोगों के निर्माण के लिए महत्वपूर्ण है।
अस्वीकरण: उपलब्ध कराए गए सभी संसाधन आंशिक रूप से इंटरनेट से हैं। यदि आपके कॉपीराइट या अन्य अधिकारों और हितों का कोई उल्लंघन होता है, तो कृपया विस्तृत कारण बताएं और कॉपीराइट या अधिकारों और हितों का प्रमाण प्रदान करें और फिर इसे ईमेल पर भेजें: [email protected] हम इसे आपके लिए यथाशीघ्र संभालेंगे।
Copyright© 2022 湘ICP备2022001581号-3