2010-05-02 21 views
5

मैंने विंडो ऑब्जेक्ट पर "इस" बिंदुओं के संबंध में Javascript this points to Window object पर एक प्रश्न पूछा।जावास्क्रिप्ट "यह" विंडो ऑब्जेक्ट को फिर से इंगित करता है

यहां स्रोत कोड

var archive = function(){} 

archive.prototype.action = { 
    test: function(callback){ 
     callback(); 
    }, 
    test2: function(){ 
     console.log(this); 
    } 
} 

var oArchive = new archive(); 
oArchive.action.test(oArchive.action.test2); 

टिम नीचे लिखा था कि "लेकिन यह है कि समारोह तो कॉलबैक() का उपयोग कर कहा जाता है, जो इसे एक विधि के रूप में नहीं बुलाया जाता है और इसलिए इस वैश्विक वस्तु है जिसका अर्थ है"।

स्रोत कोड पर दिखाए गए अनुसार अपने वास्तविक नाम और कॉलबैक() द्वारा फ़ंक्शन को कॉल करने के बीच अंतर क्या हैं?

test2 में console.log (यह) कैसे करता है जब यह archive.action के अंदर होता है ???

उत्तर

10

जावास्क्रिप्ट में आप 4 अलग मंगलाचरण पैटर्न का उपयोग कर कार्यों को लागू कर सकते हैं:

  • समारोह मंगलाचरण
  • विधि मंगलाचरण
  • लागू करें/कॉल मंगलाचरण
  • निर्माण मंगलाचरण

पैटर्न मुख्य रूप से this पैरामीटर कैसे प्रारंभ किया गया है में भिन्न है।

आप oArchive.action.test2() उपयोग करते हैं, आप विधि पैटर्न के साथ test2() समारोह लागू किया जाएगा, और इस मामले में thisaction वस्तु के लिए बाध्य किया जाएगा। जब भी आमंत्रण अभिव्यक्ति में परिशोधन होता है तो जावास्क्रिप्ट विधि पैटर्न का उपयोग करेगा (यानी . डॉट अभिव्यक्ति या [subscript] अभिव्यक्ति)।

दूसरी ओर, जब कोई कार्य किसी ऑब्जेक्ट की संपत्ति नहीं होता है, तो इसे फ़ंक्शन पैटर्न का उपयोग करके बुलाया जाता है। इस मामले में, this पैरामीटर वैश्विक वस्तु से जुड़ा हुआ है, और वास्तव में यह है कि जावास्क्रिप्ट आपके callback() फ़ंक्शन का आविष्कार कर रहा है।

Douglas Crockford अपने Good Parts book में, यह भाषा के डिजाइन में गलती के रूप में वर्णन करता है, और कुछ संभावित कामकाज सुझाता है। आप मामले में, एक आसान तरीके को कॉलबैक call() या apply() का उपयोग कर को लागू करने की, Tim Down suggested in your previous question होगी:

callback.call(this); 

यह काम करता है क्योंकि लागू करें/कॉल मंगलाचरण पैटर्न आप this का मूल्य चुनें, जो कि तुम क्या आवश्यकता होती है की सुविधा देता है ।

+0

मुझे लगता है कि आप oArchive.action.test2.bind (oArchive.action.test) का उपयोग कर सकते हैं oarchive.action.test पर कॉल करते समय –

3

जावास्क्रिप्ट में this कीवर्ड किसी फ़ंक्शन के मालिक पर सेट है। फ़ंक्शन ऑब्जेक्ट्स अपने स्वामित्व को स्वयं नहीं बनाए रखते हैं, इसके बजाय स्वामित्व को एक फ़ंक्शन कॉल करने के तरीके से घटाया जाता है।

जैसे:

var foo = function() { 
    alert('hello'); 
}; 
var abc = {}; 
abc.bar = foo; 

, बस की तरह

foo(); 

समारोह बुला दुभाषिया क्या आपत्ति समारोह से जुड़ी हो सकती है के बारे में कोई सुराग नहीं देता है।यह कई ऑब्जेक्ट्स से जुड़ा हो सकता है, यह एक चर हो सकता है आदि। इसलिए दुभाषिया वैश्विक वस्तु पर this सेट करता है।

लेकिन फिर भी, जब की तरह

abc.bar(); 

एक समारोह बुला दुभाषिया जानता है कि समारोह abc वस्तु से जुड़ा हुआ है, इसलिए thisabc को तैयार है। यहां तक ​​कि यदि bar और foo दोनों एक ही कार्य ऑब्जेक्ट को संदर्भित करते हैं, तो कॉलिंग पैटर्न में अंतर अलग-अलग व्यवहार करने के लिए this का कारण बनता है।