2010-07-23 7 views
14

मैं बंद (और सामान्य में Javscript) के लिए एक शुरुआत कर रहा हूँ, और मैं क्या इस कोड में हो रहा है के रूप में एक संतोषजनक स्पष्टीकरण नहीं मिल सकता है:इस बंद होने पर 'इस' कीवर्ड तक पहुंच क्यों नहीं है? - jQuery

function myObject(){ 
    this.myHello = "hello"; 
    this.myMethod = do_stuff; 
} 

function do_stuff(){ 
    var myThis = this; 
    $.get('http://example.com', function(){ 
     alert(this.myHello); 
     alert(myThis.myHello); 
    }); 
} 

var obj = new myObject; 
obj.myMethod(); 

यह सूचित करेंगे 'अनिर्धारित' और फिर 'हैलो'। जाहिर है यह jQuery विशिष्ट नहीं होना चाहिए, लेकिन यह मेरे मूल कोड का सबसे सरल रूप है जिसके साथ मैं आ सकता हूं। do_stuff() में बंद होने पर उस दायरे में चर के लिए पहुंच है, लेकिन जाहिर है यह नियम this कीवर्ड पर लागू नहीं होता है।

सवाल:

जब बंद do_stuff() के दायरे से बाहर पारित हो जाता है (इस मामले $.get() में) क्या this का क्या होगा? myThis में this की एक प्रति शामिल है या इसका संदर्भ है? क्या यह आमतौर पर this का उपयोग बंद करने का अच्छा विचार नहीं है?

किसी भी प्रतिक्रिया की बहुत सराहना की।

उत्तर

8

क्या होता है जब बंद करना do_stuff() (इस मामले में $ .get()) के दायरे से बाहर हो जाता है?

प्रत्येक समारोह का अपना निष्पादन संदर्भ, this कीवर्ड वर्तमान संदर्भ का मान प्राप्त करता है।

doStuff पहचानकर्ता और obj.myMethod संपत्ति एक ही समारोह वस्तु का उल्लेख है, लेकिन जब से तुम एक वस्तु (obj.myMethod();) की संपत्ति के रूप में यह लागू कर रहे हैं, कि समारोह के अंदर this मूल्य, obj के पास भेजेगा।

जब अजाक्स अनुरोध सफल रहा, jQuery दूसरा समारोह (एक नई निष्पादन संदर्भ शुरू) लागू करेगा, और यह एक उद्देश्य यह है कि कि कॉलबैक की this मूल्य के रूप में अनुरोध के लिए इस्तेमाल किया सेटिंग होती हैं का प्रयोग करेंगे।

क्या myThis इसमें इसकी एक प्रति है या इसका संदर्भ है?

myThis पहचानकर्ता वस्तु है कि यह भी बाहरी गुंजाइश पर this मूल्य द्वारा संदर्भित करने के लिए एक संदर्भ शामिल होंगे।

क्या यह आमतौर पर बंद करने में इसका उपयोग करने का अच्छा विचार नहीं है?

यदि आप समझते हैं कि this मूल्य को कैसे संभाला जाता है, मुझे कोई समस्या नहीं दिखाई देती है ...

function myObject(){ 
    this.myHello = "hello"; 
    this.myMethod = do_stuff; 
} 

function do_stuff(){ 
    $.get('http://example.com', jQuery.proxy(function(){ 
     alert(this.myHello); 
    }, this)); // we are binding the outer this value as the this value inside 
} 

var obj = new myObject; 
obj.myMethod(); 

भी देखें:

आप jQuery का उपयोग कर रहे हैं, आप jQuery.proxy विधि जांच करना चाह सकते हैं, एक उपयोगिता विधि है कि एक समारोह के संदर्भ संरक्षित करने के लिए इस्तेमाल किया जा सकता, उदाहरण के लिए है

+0

का उपयोग करके मैं एक फॉलो अप पूछने वाला था लेकिन आपके नवीनतम संपादन ने इसका उत्तर दिया। धन्यवाद! – thewiglaf

+0

@thewiglaf: आपका स्वागत है! अगर आपको कोई संदेह है तो टिप्पणी करने के लिए स्वतंत्र महसूस करें ... – CMS

2
$.get('http://example.com', function(){ 
    alert(this.myHello); // this is scoped to the function 
    alert(myThis.myHello); // myThis is 'closed-in'; defined outside 
}); 

टिप्पणी गुमनाम समारोह। यह उस क्षेत्र में कार्य का दायरा है। myThis बाहरी दायरे का यह है, जहां myHello परिभाषित किया गया है। फायरबग में इसे देखें।

'यह' हमेशा निष्पादन के वर्तमान दायरे को संदर्भित करता है, मुझे विश्वास है। यदि आप वर्तमान दायरा लेना चाहते हैं और इसे संरक्षित करना चाहते हैं, तो आप जो करते हैं वह करते हैं, जो इसे किसी अन्य चर के लिए असाइन किया जाता है।

1
$.get('http://example.com', function(){ 
    // inside jQuery ajax functions - this == the options used for the ajax call 
}); 

क्या होता है जब बंद करें do_stuff() के दायरे से बाहर हो जाता है (इस मामले में $ .get())?

कुछ नहीं "होता है" इसे करने के लिए, इस, कार्य बंद होने से बुलाया के निष्पादन के संदर्भ स्वचालित रूप से this वारिस नहीं है कि बंद के लिए अभी भी इस है।

क्या myThis इसमें इसकी एक प्रति है या इसका संदर्भ है?

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

क्या यह आमतौर पर बंद करने में इसका उपयोग करने का अच्छा विचार नहीं है?

यह आम तौर पर एक अच्छा विचार बंद होने में this उपयोग करने के लिए है, लेकिन अगर आप एक ही this उपयोग करने के लिए है कि जरूरत के अंदर बंद का उपयोग किया जा रहे हैं, अपने अच्छा अभ्यास करने के लिए आप वास्तव में क्या किया: var someName = this; और उसके बाद someName

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