2012-10-04 16 views
9

संभव डुप्लिकेट या तो उपयोग करने के लिए:
What underlies this JavaScript idiom: var self = this?अंतर उनमें से

मैं उलझन में है कि जब जावास्क्रिप्ट में स्वयं और इस का उपयोग कर रहा हूँ।
मुझे पता है कि यह वर्तमान संदर्भ को संदर्भित करता है और स्वयं वर्तमान विंडो को संदर्भित करता है।
जैसा कि मैं टाइटेनियम में एक अनुप्रयोग विकसित कर रहा हूं। मैं जानना चाहता हूं कि स्वयं या इस या क्या टाइटेनियम विकास में स्वयं की कोई अवधारणा है।

यहाँ नमूना कोड कि मैं अपने टाइटेनियम commonJS मॉड्यूल

var auth = require('/SDKTest/auth'); 
var nodeAPI = require('/SDKTest/nodeAPI'); 
function myAPI() { 
    this.auth = auth; 
    this.nodeAPI = nodeAPI; 
    return this; 
    } 
module.exports = myAPI; 

इस कोड काम करता है में कर रहा हूँ, लेकिन मैं इस के स्थान पर स्वयं उपयोग कर सकते हैं? और बजाय इस का उपयोग कर के मैं एक नाम स्थान बना सकते हैं और कुछ इस तरह कर सकते हैं:

function myAPI() { 
    var api = {}; 
    api.auth = auth; 
    api.nodeAPI = nodeAPI; 
    return api; 
    } 

दोनों दृष्टिकोण काम करते हैं लेकिन का उपयोग करने का उपयोग क्या यह आपका प्रश्न यहाँ पर

+0

देखें http://stackoverflow.com/questions/337878/js-var-self-this –

+0

मैं अपने प्रश्न को अद्यतन किया है वहाँ –

उत्तर

3

कुछ हद तक है भ्रमित, यह पूछने जैसा है: क्या मैं सेब या टमाटर खरीदता हूं? जवाब यह है कि यह वास्तव में निर्भर करता है कि आप क्या करना चाहते हैं, क्योंकि वे पूरी तरह अलग हैं।

अनिवार्य रूप से, आप कुछ हद तक अपने स्वयं के सवाल का जवाब दे दिया है क्योंकि आप पहले से ही दोनों के बीच अंतर पता है:

  • this वर्तमान संदर्भ
  • selfwindow
को संदर्भित करता है को संदर्भित करता है
function myAPI() { 
    this.auth = auth; 
    this.nodeAPI = nodeAPI; 
    return this; 
    } 
module.exports = myAPI; 

आप पूछ रहे हैं कि आप सी इसके बजाय self का उपयोग करें। इसके बारे में सोचें, this आपको क्या करने की अनुमति देता है? यह संदर्भ को संदर्भित करने के लिए आपको अनुमति देता है। संदर्भ क्या है, ठीक है, यह module है जब आप module.exports() पर कॉल करते हैं। और module अधिकतर window होने की संभावना नहीं है, इसलिए नहीं, आप यहां self का उपयोग नहीं कर सकते हैं।

क्या यह प्रश्न का उत्तर देता है?

दूसरा कोड उदाहरण कुछ पूरी तरह से अलग दिखता है। मुझे नहीं पता कि इसका क्या बनाना है।

+0

@phantOm दूसरा कोड में मैं सिर्फ बनाने रहा हूँ पर एक नमूना कोड जोड़ा मेरी स्वयं का कस्टम नेमस्पेस जिसमें ऑथ और नोडैपीआई ऑब्जेक्ट्स –

+0

@AjeetPratapMaurya हां है, मैं इसे देखता हूं। बात यह है कि यह पूरी तरह से अलग है। यदि आप इसे 'मॉड्यूल.एक्सपोर्ट' पर असाइन करना चाहते थे, तो यह 'मॉड्यूल' को संशोधित करने के बजाय 'मॉड्यूल' एक्सपोर्ट्स() 'ए * नई * ऑब्जेक्ट 'एथ' और 'नोडैपआई' के साथ वापस लौटाएगा, जैसा कि पहले 'मॉड्यूल' को संशोधित करने के बजाय कोड करता है – phant0m

8

self एक जावास्क्रिप्ट कीवर्ड नहीं है! प्रोग्रामर इसका उपयोग करते हैं कि कक्षाओं को परिभाषित करते समय हमेशा ऑब्जेक्ट के लिए वैध संदर्भ होता है।

var Person = function() { 
    var self = this; 
    // private function 
    function say(what) { 
     alert(what); 
    } 
    self.fetchSomething = function() { 
     var xhr = Ti.Network.createHTTPClient({ 
      onload: function() { 
       // in this case 'this' is referencing to xhr!!! 
       say(this.responseText); 
      } 
     }); 
     xhr.open('GET', 'http://www.whatever.com'); 
     xhr.send(); 
    } 
    return self; 
} 
var p = new Person(); 
p.fetchSomething();