2012-10-31 10 views
6

के भीतर से "यह" संदर्भित करना कुछ मुझे हमेशा जावास्क्रिप्ट में ऑब्जेक्ट-उन्मुख कोडिंग के तरीके के बारे में परेशान करता है। बंद, अतिरिक्त चर alway लग रहा था ... मेरे लिए अत्यधिक बनानेजावास्क्रिप्ट कॉलबैक

MyClass.prototype.doSomething = function(obj, callback) { 
    var me = this; // ugh 
    obj.loadSomething(function(err, result) { 
     me.data = result; // ugh 
     callback(null, me); 
    }); 
} 

पहले: वहाँ एक कॉलबैक है, मैं अक्सर वस्तु जो मूल रूप से समारोह कहा जाता है, जो मुझे इस तरह कुछ करने के लिए सुराग का संदर्भ लेना चाहते। इसके अलावा, मुझे आश्चर्य है कि क्या यह "मुझे" वैरिएबल को वापस कॉलबैक में पास करके समस्याएं (परिपत्र संदर्भ? Un-GCd ऑब्जेक्ट्स?) उत्पन्न कर सकता है।

क्या इस बारे में जाने का कोई बेहतर तरीका है? क्या यह दृष्टिकोण बुरा है?

+1

'यह' एक चर नहीं है। 'यह' बंद नहीं किया जा सकता है। दृष्टिकोण ठीक है। –

+1

"बुराई" और "अत्यधिक" के बारे में एफयूडी मुझे परेशान करता है। बॉयलरप्लेट की तरह नहीं है, लेकिन इसके साथ काल्पनिक समस्याओं का आविष्कार क्यों करें? आपको उसी संलग्न डेटा के संदर्भ को बनाए रखना होगा, इससे कोई फर्क नहीं पड़ता कि आप किस दृष्टिकोण का उपयोग करते हैं, क्योंकि आंतरिक फ़ंक्शन नहीं बदलता है। चाहे आप केवल कम से कम डेटा का संदर्भ रख सकें, कुछ ऐसा है जो दुभाषिया को चिंता करनी चाहिए। – millimoose

+0

@millimoose अच्छी तरह से कहा - मैं उस अंतिम पंक्ति को सारांशित करने के लिए एक रास्ते के साथ आने में विफल रहा। (और मैं अभी भी "बुराई" में भाग लेता हूं - अच्छी तरह से "बुराई" नहीं, बल्कि वास्तव में बहुत ही मज़ेदार तरीके से भयानक - कोड जो 'नए फंक्शन ("..") का उपयोग करता है "मुद्दों से बचें"। –

उत्तर

8

यह वही है Function.bind() के लिए है:

MyClass.prototype.doSomething = function(obj, callback) { 
    obj.loadSomething((function(err, result) { 
     this.data = result; 
     callback(null, this); 
    }).bind(this)); 
} 
+3

शायद 'me'' को ' – Shmiddty

+0

@ श्मिटिटी अरेप्स, अच्छा पकड़ो।अच्छे जवाब के लिए – millimoose

+0

+1, प्रलेखन लिंक के लिए स्वीकृत उत्तर। –

7

AFAIK, आप जो कर रहे हैं वह इस तरह की चीज़ के लिए स्वीकार्य पैटर्न है, और इससे कोई समस्या नहीं आती है। बहुत से लोग या तो "स्वयं" या "उस" को संग्रहीत संदर्भ के रूप में उपयोग करते हैं - यदि आप एक अजगर पृष्ठभूमि से आते हैं तो "स्वयं" अधिक सहज हो सकता है।

+2

मुझे 'self' पसंद है। हालांकि वहां * * खिड़की 'भी है .. हालांकि मैंने इस मुद्दे पर कभी भ्रम नहीं किया है। –

+0

और कभी-कभी [window.self] (https://developer.mozilla.org/en-US/docs/DOM/window.self) के साथ स्वयं को भ्रमित किया जा सकता है – epascarello

3

यह जावास्क्रिप्ट के लिए सामान्य व्यवहार है। this के लिए संदर्भ loadSomething ऑब्जेक्ट के लिए बदल गया है, और कॉलबैक होने का कारण आपके me चर जैसे बंद संदर्भों को कैप्चर करना है।

3

आप आंतरिक समारोह के दायरे को यह बाध्य कर सकते हैं

MyClass.prototype.doSomething = function(obj, callback) { 
    obj.loadSomething(function(err, result) { 
     this.data = result; 
     callback(null, this); 
    }.bind(this)); 
} 
1

यह सबसे आम तरीका मैं इसे संभाल करने के लिए देखा है मैं आमतौर पर var self = this ;, का उपयोग करते हैं, लेकिन यह सिर्फ एक नाम है। हालांकि यह एक अतिरिक्त चर है, जावास्क्रिप्ट ओवरहेड पर विचार करते हुए और तथ्य यह है कि यह ऑब्जेक्ट को डुप्लिकेट नहीं करता है, यह वास्तव में प्रदर्शन को प्रभावित नहीं करेगा।

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