2013-10-23 7 views
5

नीचे दिए गए कोड में, somethingUseful.thisUsefulThing को setTimeout से कहा जाता है, क्या यह somethingUseful.thatUsefulThing का संदर्भ दे सकता है?जावास्क्रिप्ट: कार्यों का एक शब्दकोश: क्या फ़ंक्शन संदर्भ इसके शब्दकोश से कार्य कर सकता है?

Uncaught TypeError: Object [object global] has no method 'thatUsefulThing' 
+6

आपका क्या मतलब है "वस्तु का दायरा" बनाम "वैश्विक स्तर का दायरा"? लिखित कार्यों के रूप में आपका कोड। – user2736012

+1

बस ध्यान रखें कि जब आप 'object.method()' करते हैं, तो 'method' में 'this' का मान' ऑब्जेक्ट 'का संदर्भ बन जाता है। कोई फर्क नहीं पड़ता कि ऑब्जेक्ट और विधि कब बनाई गई थी। यह सब मायने रखता है * कैसे * आप विधि को कॉल करते हैं। एक ही ऑब्जेक्ट को एक अलग ऑब्जेक्ट पर रखें, उसे उस ऑब्जेक्ट से कॉल करें, और 'इस' का मान नई ऑब्जेक्ट को संदर्भित करेगा। 'var o = {thatUsefulThing: function() {console.log (" मैं भी उपयोगी हूं! ");}}; o.foo = कुछ उपयोगी। यह उपयोगी है; o.foo(); // मैं भी उपयोगी हूं – user2736012

+0

वहां, मैंने इसे उस त्रुटि को सीधे प्रतिबिंबित करने के लिए संपादित किया है जिसे मैं संक्षेप में सामना कर रहा हूं। – Synthead

उत्तर

3

बस, आपके प्रश्न का उत्तर करने के लिए हाँ, thisUsefulThing thatUsefulThing

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

var somethingUseful = { 
    thisUsefulThing: function() { 
    this.thatUsefulThing(); 
    }, 

    thatUsefulThing: function() { 
    console.log("I am useful!"); 
    } 
} 

setTimeout(somethingUseful.thisUsefulThing, 1000); 

अभी, मैं इस त्रुटि हो रही है वास्तव में वैश्विक नहीं, यह किसी भी संदर्भ का संदर्भ है जो सभी प्रत्यक्ष वंशजों के लिए उपयोगी है।

जब मैं शाब्दिक वस्तुओं के साथ काम कर रहा हूँ, मैं आमतौर पर उन्हें नाम से नहीं बल्कि साथ तुलना संदर्भ 'इस' है, इसलिए आपके मामले में मैं somethingUseful.thatUsefulThing()

क्यों साथ 'this.thatUsefulThing()' की जगह लेंगे ? क्योंकि यह वैश्विक स्तर पर काम करता है, वैसे भी!

संपादित करें:

रूप plalx मेरा उत्तर करने के लिए अपने टिप्पणी में बताया, इस वर्ग के (एक उदाहरण वर्ग के सदस्य के साथ) को लागू करने के लिए सर्वोत्तम प्रथाओं कार्यात्मक वर्गों/प्रोटोटाइप का उपयोग करें और कुछ इस तरह दिखेगा:

function SomethingUseful() { 
    this.member = 'I am a member'; 
} 
SomethingUseful.prototype.thisUsefulThing = function() { 
    this.thatUsefulThing(); 
} 
SomethingUseful.prototype.thatUsefulThing = function() { 
    console.log('I am useful, and ' + this.member); 
} 
usefulObject = new SomethingUseful(); 

usefulObject.thisUsefulThing(); // logs fine with access to this.member 
setInterval(usefulObject.thisUsefulThing.bind(usefulObject), 1000); // has access to this.member through bind() 
+1

हाँ, मैंने यही सोचा, विशेष रूप से जब मैंने पोस्ट किया गया कोड वास्तव में काम किया, हाहाहा। यदि आप चाहें तो मेरे संपादित प्रश्न को देखने के लिए एक सेकंड लें। और हां, जावास्क्रिप्ट एक (बहुत अधिक अतिदेय) मेरी सूची में से एक है। – Synthead

+1

अपने प्रश्न को हल करने के लिए मैं अभी भी 'this.thatUsefulThing()' को कुछ 'में बदल दूंगा। उपयोगी यूथफुलिंग()' – Miles

1

बस मान somethingUseful पर बाध्य करें।

setTimeout(somethingUseful.thisUsefulThing.bind(somethingUseful), 1000); 
+0

बाध्यकारी के बजाय 'इस' के खराब संदर्भ को ठीक करने के लिए शायद बेहतर होगा। – Miles

+0

@ i-live-in-a-storm-drain वास्तव में मुझे लगता है कि यह काफी विपरीत है। एक परिवर्तनीय नाम पर निर्भर करना काफी लचीला, त्रुटि-प्रवण और DRY होने से बहुत दूर है। – plalx

+0

इस बारे में सोचें: यदि आप बाध्यकारी हैं, तो आप पहले से ही वैरिएबल नाम दो बार टाइप कर रहे हैं, साथ ही विधियों और कोष्ठक भी। मुझे बहुत WET लगता है। – Miles

संबंधित मुद्दे