2011-07-02 12 views
5

इस कोड के परिणामस्वरूप "!" कंसोल पर लॉग इन किया गया है।जावास्क्रिप्ट और गुमनाम कार्यों में बंद होने के विनिर्देश

var g = {}; 
(function() { 
    var t = this; 
    t.x = "x"; 
    g.a = function() { 
     console.log(t.x); 
    }; 
})(); 

(function() { 
    var t = this; 
    t.x = "!"; 
    g.b = function() { 
     console.log(t.x); 
    }; 
})(); 

g.a(); 

करो अनाम प्रक्रियाएं एक this का हिस्सा? क्या मैं this गलत उपयोग कर रहा हूँ? मैं वास्तव में समझ नहीं पा रहा हूं कि यहां क्या हो रहा है।

मैं g.a() के लिए चाहते पहले गुमनाम समारोह में परिभाषित x का मूल्य लौटने जारी रखने के लिए चाहते हैं।

यदि मैं कोई फर्क पड़ता हूं तो मैं node.js का उपयोग कर रहा हूं।

उत्तर

4

तत्काल कार्यों में, thisglobal object[docs] को दर्शाता है। तो इस मामले में दोनों कार्यों में this वास्तव में एक ही तत्व को संदर्भित करता है और आप दूसरी कॉल के साथ x ओवरराइट कर रहे हैं।

क्या वस्तु this कैसे समारोह कहा जाता है से निर्धारित होता है को दर्शाता है।

  • तुम सिर्फ funcName(); के साथ एक समारोह निष्पादित करते हैं, तो thisवैश्विक वस्तु को दर्शाता है।
  • समारोह एक वस्तु, obj.funcName() के एक प्रॉपर्टी को निर्दिष्ट किया जाता है, तो this वस्तु को दर्शाता है।
  • यदि आप new ऑपरेटर के साथ फ़ंक्शन को कॉल करते हैं, new funcName();, this फ़ंक्शन प्रोटोटाइप से प्राप्त एक खाली ऑब्जेक्ट को संदर्भित करता है।

तुम भी स्पष्ट रूप से call[docs] या apply[docs] का उपयोग करके this सेट कर सकते हैं।


इसके बजाय this की चर्चा करते हुए, आप दोनों कार्यों में एक नई वस्तु बना सकते हैं:

var t = {}; 

अतिरिक्त ध्यान दें: यह कोई अंतर नहीं है कि क्या आप ब्राउज़र में कोड चलाने बनाता है या node.js. के साथ वैश्विक वस्तु विनिर्देश का हिस्सा है और इसे निष्पादन पर्यावरण द्वारा प्रदान किया जाना है। ब्राउज़रों में यह window ऑब्जेक्ट है, मैं यह नहीं करता कि यह node.js में क्या है, लेकिन यह तब तक कोई फर्क नहीं पड़ता जब तक यह विनिर्देशन का पालन करता है।

+0

'कभी कभी समारोह का उल्लेख this' नहीं है? –

+3

@luxun: क्या आप स्वयं कार्य का मतलब है? नहीं कभी नहीं। –

+3

ठीक है, जब तक कि आप विशेष रूप से चीजों को सेट अप नहीं करते हैं, लेकिन यह अजीब तरह का होगा। यह निश्चित रूप से डिफ़ॉल्ट या कुछ भी नहीं करता है। – Pointy

3

फ़ेलिक्स क्लिंग सही लंबा उत्तर है। लेकिन मैं मैं क्या लगता है कि आप वास्तव में चाहते हैं के साथ झंकार करना चाहता था:

var g = {}; 
(function() { 
    var x = "x"; 
    g.a = function() { 
     console.log(x); 
    }; 
})(); 

(function() { 
    var x = "!"; 
    g.b = function() { 
     console.log(x); 
    }; 
})(); 

g.a(); // "x" 
g.b(); // "!" 

अब g.a() और g.b() दोनों प्रिंट आउट x, लेकिन हर समारोह की अपनी अलग x बंद के साथ साझा किया है। यदि इन युद्धों में से प्रत्येक के लिए इन वर्रों को निजी रूप से केवल एकमात्र सुलभ होना चाहिए, तो इस तरह आप उन्हें छुपाते हैं और कई कॉल के माध्यम से उन्हें जारी रखते हैं।

1

के रूप में आप यह दिखाया है जब मैं क्रोम में डीबगर में इस स्क्रिप्ट को देखो, दोनों गुमनाम कार्यों में "इस" मान वैश्विक चर "खिड़की" को तैयार है।इसका मतलब है कि प्रत्येक गुमनाम समारोह window.x का मूल्य स्थापित कर रही है तो पिछले एक निष्पादित जीत और मूल्य है कि बच जाता है, इस प्रकार window.x == "!" दूसरा गुमनाम फ़ंक्शन निष्पादित करने के बाद है।

यह आप क्या उम्मीद मेरे लिए स्पष्ट नहीं है कि "इस" होने के लिए या क्या आप वास्तव में इस कोड के साथ पूरा करने के लिए तो मैं क्या विकल्प सुझाने के लिए पता नहीं है की कोशिश कर रहे हैं। तुम सिर्फ गुमनाम समारोह में पहले वाली स्थिति आंतरिक समारोह के लिए जीवित रहने के लिए चाहते हैं, तो आप सिर्फ स्थानीय चर (जो बंद में बच जाएगा) और सभी "इस" संदर्भ का उपयोग नहीं पर भरोसा कर सकते हैं। स्क्वीजी का उदाहरण दिखाता है कि।

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