questions - javascript programs




जावास्क्रिप्ट में, "यह" ऑपरेटर असंगत क्यों है? (6)

आप फंक्शन का उपयोग भी कर सकते हैं। लागू करें ( thisArg , argsArray ) ... जहां यह एआरजी आपके फ़ंक्शन के अंदर इसका मान निर्धारित करता है ... दूसरा पैरामीटर एक वैकल्पिक तर्क सरणी है जिसे आप अपने फ़ंक्शन पर भी पास कर सकते हैं।

यदि आप दूसरे तर्क का उपयोग करने की योजना नहीं बनाते हैं, तो इसे कुछ भी पास न करें। इंटरनेट एक्सप्लोरर आपके लिए एक टाइप एरर फेंक देगा यदि आप null (या कुछ भी जो सरणी नहीं है) को function.apply () का दूसरा तर्क ...

आपके द्वारा दिए गए उदाहरण कोड के साथ यह कुछ ऐसा दिखाई देगा:

YAHOO.util.Connect.asyncRequest(method, uri, callBack.Apply(this));

जावास्क्रिप्ट में, "यह" ऑपरेटर अलग-अलग परिदृश्यों के तहत विभिन्न चीजों को संदर्भित कर सकता है।

आमतौर पर जावास्क्रिप्ट "ऑब्जेक्ट" के भीतर एक विधि में, यह वर्तमान ऑब्जेक्ट को संदर्भित करता है।

लेकिन जब कॉलबैक के रूप में उपयोग किया जाता है, तो यह कॉलिंग ऑब्जेक्ट का संदर्भ बन जाता है।

मैंने पाया है कि इससे कोड में समस्याएं आती हैं, क्योंकि यदि आप कॉलबैक फ़ंक्शन के रूप में जावास्क्रिप्ट "ऑब्जेक्ट" के भीतर कोई विधि उपयोग करते हैं तो आप यह नहीं बता सकते कि "यह" वर्तमान "ऑब्जेक्ट" को संदर्भित करता है या फिर "यह" संदर्भित करता है कॉलिंग ऑब्जेक्ट

क्या कोई इस समस्या को हल करने के तरीके के बारे में उपयोग और सर्वोत्तम प्रथाओं को स्पष्ट कर सकता है?

   function TestObject() {
            TestObject.prototype.firstMethod = function(){
                      this.callback();
                      YAHOO.util.Connect.asyncRequest(method, uri, callBack);

            }

            TestObject.prototype.callBack = function(o){
              // do something with "this"
              //when method is called directly, "this" resolves to the current object
              //when invoked by the asyncRequest callback, "this" is not the current object
              //what design patterns can make this consistent?
              this.secondMethod();
            }
            TestObject.prototype.secondMethod = function() {
             alert('test');
            }
        }

इससे पहले कि मैं इस चर के जादू पर बेबिल करने से पहले सर्वोत्तम प्रथाओं पर त्वरित सलाह। यदि आप जावास्क्रिप्ट में ओओपी चाहते हैं जो अधिक पारंपरिक / शास्त्रीय विरासत पैटर्न को बारीकी से दर्पण करता है, तो एक ढांचा चुनें, इसके quirks सीखें, और चालाक पाने की कोशिश मत करो। यदि आप चालाक होना चाहते हैं, तो जावास्क्रिप्ट को एक कार्यात्मक भाषा के रूप में जानें, और कक्षाओं जैसी चीजों के बारे में सोचने से बचें।

जो जावास्क्रिप्ट के बारे में ध्यान में रखने के लिए सबसे महत्वपूर्ण चीजों में से एक लाता है, और जब यह समझ में नहीं आता है तो खुद को दोहराने के लिए। जावास्क्रिप्ट में कक्षाएं नहीं हैं। अगर कुछ कक्षा की तरह दिखता है, तो यह एक चालाक चाल है। जावास्क्रिप्ट में ऑब्जेक्ट्स (कोई व्युत्पन्न उद्धरण आवश्यक नहीं है) और फ़ंक्शन । (यह 100% सटीक नहीं है, फ़ंक्शन केवल ऑब्जेक्ट्स हैं, लेकिन कभी-कभी अलग-अलग चीजों के बारे में सोचने में सहायक हो सकता है)

यह चर कार्यों से जुड़ा हुआ है। जब भी आप किसी फ़ंक्शन का आह्वान करते हैं, तो यह फ़ंक्शन का आह्वान करने के आधार पर एक निश्चित मान दिया जाता है। इसे अक्सर आमंत्रण पैटर्न कहा जाता है।

जावास्क्रिप्ट में फ़ंक्शन का आह्वान करने के चार तरीके हैं। आप फंक्शन के रूप में, एक कन्स्ट्रक्टर के रूप में, और लागू होने के साथ फ़ंक्शन को विधि के रूप में बुला सकते हैं।

एक विधि के रूप में

एक विधि एक ऐसा कार्य है जो किसी ऑब्जेक्ट से जुड़ा हुआ है

var foo = {};
foo.someMethod = function(){
    alert(this);
}

जब किसी विधि के रूप में बुलाया जाता है, तो यह ऑब्जेक्ट से जुड़ा होगा कि फ़ंक्शन / विधि का एक हिस्सा है। इस उदाहरण में, यह foo करने के लिए बाध्य होगा।

एक समारोह के रूप में

यदि आपके पास स्टैंड स्टैंड अकेले फ़ंक्शन है, तो यह चर "ग्लोबल" ऑब्जेक्ट से बाध्य होगा, ब्राउज़र के संदर्भ में लगभग हमेशा विंडो ऑब्जेक्ट।

 var foo = function(){
    alert(this);
 }
 foo();

यह हो सकता है कि आप क्या कर रहे हैं , लेकिन बुरा महसूस न करें। बहुत से लोग इसे एक खराब डिजाइन निर्णय मानते हैं। चूंकि कॉलबैक को एक फ़ंक्शन के रूप में बुलाया जाता है और एक विधि के रूप में नहीं, इसलिए आप देख रहे हैं कि असंगत व्यवहार क्या प्रतीत होता है।

बहुत से लोगों को कुछ ऐसा करने से समस्या आती है, उम, यह

var foo = {};
foo.someMethod = function (){
    var that=this;
    function bar(){
        alert(that);
    }
}

आप एक वेरिएबल को परिभाषित करते हैं जो इससे इंगित करता है। क्लोजर (यह सब एक विषय है) इसे आसपास रखता है , इसलिए यदि आप कॉलबैक के रूप में बार को कॉल करते हैं, तो इसका अभी भी एक संदर्भ है।

एक निर्माता के रूप में

आप एक फंक्शन को कन्स्ट्रक्टर के रूप में भी बुला सकते हैं। नामकरण सम्मेलन के आधार पर आप ( TestObject ) का उपयोग कर रहे हैं, यह भी हो सकता है कि आप क्या कर रहे हैं और यह आपको क्या चल रहा है

आप new कीवर्ड के साथ एक कन्स्ट्रक्टर के रूप में एक फ़ंक्शन का आह्वान करते हैं।

function Foo(){
    this.confusing = 'hell yeah';
}
var myObject = new Foo();

जब एक निर्माता के रूप में बुलाया जाता है, तो एक नया ऑब्जेक्ट बनाया जाएगा, और यह उस ऑब्जेक्ट से बाध्य होगा। दोबारा, यदि आपके पास आंतरिक कार्य हैं और उन्हें कॉलबैक के रूप में उपयोग किया जाता है, तो आप उन्हें कार्यों के रूप में आमंत्रित करेंगे, और यह वैश्विक वस्तु से जुड़ा होगा। उस var that = this; प्रयोग करें जो var that = this; चाल / पैटर्न।

कुछ लोग सोचते हैं कि रचनाकार / नया कीवर्ड जावा / पारंपरिक ओओपी प्रोग्रामर को कक्षाओं के समान कुछ बनाने के तरीके के रूप में एक हड्डी फेंक दिया गया था।

आवेदन विधि के साथ।

अंत में, प्रत्येक फ़ंक्शन में एक विधि है (हां, कार्य जावास्क्रिप्ट में ऑब्जेक्ट्स हैं) apply नाम। आवेदन करने से आप यह निर्धारित कर सकते हैं कि इसका क्या मूल्य होगा, और आपको तर्कों की एक सरणी में भी जाने देता है। यहां एक बेकार उदाहरण है।

function foo(a,b){
    alert(a);
    alert(b);
    alert(this);
}
var args = ['ah','be'];
foo.apply('omg',args);

जैसे ही कॉलबैक विधियों को अन्य संदर्भ से बुलाया जाता है, मैं आम तौर पर कुछ ऐसा उपयोग कर रहा हूं जिसे मैं कॉलबैक संदर्भ कहता हूं:

var ctx = function CallbackContext()
{
_callbackSender
...
}

function DoCallback(_sender, delegate, callbackFunc)
{
 ctx = _callbackSender = _sender;
 delegate();
}

function TestObject()
{
   test = function()
  {
     DoCallback(otherFunc, callbackHandler);
  }

  callbackHandler = function()
{
 ctx._callbackSender;
 //or this = ctx._callbacjHandler;
}
}

मेरा मानना ​​है कि यह [बंद] [ http://en.wikipedia.org/wiki/Closure_(computer_science) का विचार जावास्क्रिप्ट में कैसे काम करता है इस कारण हो सकता है।

मैं बस बंद होने के साथ पकड़ने के लिए मिल रहा हूँ। जुड़े विकिपीडिया लेख का एक पठन है।

अधिक जानकारी के साथ यहां एक और लेख है

कोई भी इसे पुष्टि करने में सक्षम है?



this फ़ंक्शन कॉल के संदर्भ के अनुरूप है। किसी ऑब्जेक्ट (नो ऑपरेटर) के हिस्से के रूप में नहीं जाने वाले कार्यों के लिए, यह वैश्विक संदर्भ (वेब ​​पृष्ठों में window ) है। ऑब्जेक्ट विधियों (ऑपरेटर के माध्यम से) नामक फ़ंक्शंस के लिए, यह ऑब्जेक्ट है।

लेकिन, आप इसे जो कुछ भी चाहते हैं उसे बना सकते हैं। सभी कार्यों में .call () और .apply () विधियां हैं जिनका उपयोग उन्हें कस्टम संदर्भ के साथ आमंत्रित करने के लिए किया जा सकता है। तो अगर मैं चिली की तरह एक वस्तु स्थापित करता हूं:

var Chile = { name: 'booga', stuff: function() { console.log(this.name); } };

... और चिली.स्टफ () का आह्वान करें, यह स्पष्ट परिणाम देगा:

booga

लेकिन अगर मैं चाहता हूं, तो मैं इसे ले सकता हूं और वास्तव में इसके साथ पेंच कर सकता हूं:

Chile.stuff.apply({ name: 'supercalifragilistic' });

यह वास्तव में काफी उपयोगी है ...






javascript