2012-06-25 21 views
16

In this commit कोई परिवर्तन होता है मैंसमझौता "इस" कीवर्ड

deferred.done.apply(deferred, arguments).fail.apply(deferred, arguments); 

व्याख्या नहीं कर सकते

deferred.done(arguments).fail(arguments); 

AFAIK हो जाता है, जब आप obj.func() जैसे कुछ वस्तु के सदस्य के रूप में एक समारोह आह्वान, समारोह के अंदर thisobj से जुड़ा हुआ है, इसलिए apply() के माध्यम से this से obj पर बाध्य करने के लिए कोई फ़ंक्शन का उपयोग करने का कोई उपयोग नहीं होगा। इसके बजाए, टिप्पणियों के मुताबिक, यह पिछले कुछ $.Callbacks.add कार्यान्वयन के कारण आवश्यक था।

मेरे संदेह jQuery के बारे में नहीं है, लेकिन जावास्क्रिप्ट भाषा स्वयं के बारे में: जब आप obj.func() की तरह एक समारोह आह्वान, यह कैसे हो सकता है कि func() अंदर this कीवर्ड obj करने के लिए बाध्य नहीं है?

+1

यह प्रश्न आपके प्रश्न से संबंधित परिवर्तन कैसे बदलता है? '.apply' का उपयोग अन्य कार्यों में तर्कों की संख्या को पास करने के लिए किया गया था, न कि क्षमताओं को मजबूर करने के संदर्भ में। – Esailija

+0

@Esailija, मुझे लगता है कि आपको बिंदु मिल गया है! – Raffaele

+0

@ क्रिस्टोफ मुझे लगता है कि वह बिंदु मिला है। आवेदन() को संदर्भ को मजबूर करने के लिए उपयोग नहीं किया गया था, क्योंकि * यह * पहले से ही * सही ढंग से रखा गया था * (और यह मेरे प्रश्न का उत्तर देता है) – Raffaele

उत्तर

5

मेरे संदेह jQuery के बारे में नहीं है, लेकिन जावास्क्रिप्ट भाषा के बारे में ही है: जब आप() obj.func की तरह एक समारोह आह्वान, यह कैसे हो सकता है कि समारोह के अंदर() इस कीवर्ड के लिए बाध्य नहीं है obj?

ठीक है, एक ही रास्ता यह संभव है अगर obj.func संदर्भ एक bound समारोह है, तो यह कोई फर्क नहीं पड़ता कि कैसे आप इसे कहते है। उस स्थिति में इससे कोई फ़र्क नहीं पड़ता कि आप फ़ंक्शन को कैसे कॉल करते हैं, चाहे आप obj.func(), func(), func.call({}), func.apply({}) कोई फर्क नहीं पड़ता। मुझे यकीन नहीं है कि प्रतिबद्धता इससे कैसे संबंधित है।

देखते हुए जैसा कॉल हस्ताक्षर: obj.func(), यह कैसे संभव है कि thisनहींobj कॉल के लिए बुलाया समारोह के अंदर है

स्पष्ट करने के लिए, मैं के रूप में व्याख्या उद्धृत प्रश्न का उत्तर देते?

+0

शानदार उत्तर। मुझे आश्चर्य है कि क्या आपने अनुमान लगाया है या यदि आप उसे जानते हैं $ .allbacks.add एक सरणी के रूप में पारित तर्कों को संभाल नहीं सकता है :) – Raffaele

+0

@Raffaele वास्तव में, न तो। यह सिर्फ इतना है कि '.apply (कुछ, तर्क)' कॉलिंग फ़ंक्शन पर पास किए गए तर्कों को पारित करने का एकमात्र तरीका है। खैर, मुझे लगता है कि आप 'eval' के साथ कुछ कर सकते हैं लेकिन यह गिनती नहीं है: डी – Esailija

+0

यह और भी बड़ा है :) तो कुंजी को आप ** तर्क ** कीवर्ड में बनाते हैं * .apply (smth, arguments) * और तुरंत इसे चेनिंग कॉल करने के लिए जोड़ा। अक्सर मुश्किल समस्याओं को हल करने के लिए किसी को विषय (अनुभव) और * पार्श्व सोच * के गहरे ज्ञान की आवश्यकता होती है :) – Raffaele

2

ऐसा

obj2.func = obj.func; 
obj2.func(); // 'this' now refers to obj2 

var func2 = obj.func; 
func2(); // 'this' now refers to the global window object 

की तरह एक और वस्तु से समारोह का हवाला या .apply() या .call() किसी भी मनमाने ढंग से वस्तु को this बाध्य करने के लिए फोन करके ही संभव है।

+0

यह सही है, लेकिन मेरे प्रश्न का उत्तर नहीं देता :) मैं ** ** ** ** के संबंध में * एबी (तर्क) * और * abapply (बी, args) * के बीच अंतर जानने के लिए चाहता था * देखें @ wnwall उत्तर – Raffaele

+0

मैंने आपके प्रश्न का उत्तर दिया: "जब आप obj.func() जैसे फ़ंक्शन का आह्वान करते हैं, तो यह func() के अंदर कैसे हो सकता है यह कीवर्ड obj से बाध्य नहीं है?" :-) आप जो प्रश्न पूछ रहे हैं वह शीर्ष पद में नहीं है: शायद आपको इसे अपडेट करना चाहिए! –

+0

मुझे ऐसा नहीं लगता: पी वास्तव में, आपका उदाहरण * func * को * obj * के सदस्य के रूप में कभी नहीं बुलाता है: यह एक ही कार्य ऑब्जेक्ट का आह्वान होता है, लेकिन किसी अन्य ऑब्जेक्ट की संपत्ति के रूप में (या तो * obj2 * या * खिड़की*)। तो * यह * का मूल्य अनुमानित और अपेक्षित है। इसके बजाए, मैंने पूछा कि क्या इंजन * ए.बी.() * निष्पादित करता है कि * बी() *, * के अंदर कोई मौका है!= ए *। – Raffaele

1

फ़ंक्शन के अंदर this नामक एक रिसीवर के साथ हमेशा एक फ़ंक्शन को कॉल किया जाता है, जिसे कॉल पर दिया जाता है।

जब आप

obj.someFunc = function() {... 

लिख रहे हैं आप नहीं कह रहे हैं कि someFunc रिसीवर obj के रूप में होना आवश्यक है, तो आप सिर्फ कह रहे हो कि obj एक संपत्ति someFunc जिसका मूल्य एक समारोह है कहा जाता है।

यदि आप करते हैं

var aFunc = obj.someFunc; 

तरह कई स्थानों पर किया जाता है (उदाहरण के लिए कॉलबैक के संदर्भित) और कहा कि

aFunc(); 

रिसीवर (this) के बाद इस मामले में खिड़की है।

ऐसा इसलिए है क्योंकि जावास्क्रिप्ट में, जावा जैसी भाषाओं के विपरीत, "प्रथम श्रेणी" ऑब्जेक्ट्स हैं, जिसका अर्थ है कि आप उन्हें मूल्य के रूप में पास कर सकते हैं और एक अद्वितीय प्रीपेस्सिस्ड रिसीवर से बंधे नहीं हैं।

+0

@Esailija और उत्तर देखें। आपने जो कहा वह सही है, लेकिन यह सवाल को संबोधित नहीं करता है, क्योंकि मैंने स्पष्ट रूप से स्रोत कोड को लिंक किया है और फ़ंक्शन वास्तव में निश्चित रूप से obj.func() – Raffaele

+0

एस्लेजा के उत्तर की ओर इशारा करते हुए टिप्पणी के लिए धन्यवाद है। तुम बिल्कुल सही हो –

1

आशुलिपि संस्करण मैं का उपयोग करें कि जावास्क्रिप्ट में this हमेशा वस्तु वर्तमान में क्रियान्वित समारोह एक विधि है जिसमें से के लिए संदर्भित करता है - विशेष मामला जब विधि एक कॉलबैक है, जब this वस्तु को संदर्भित करता है को छोड़कर जो करने के लिए कॉलबैक बाध्य है (उदाहरण के लिए एक बटन)।

संपादित करें: ध्यान दें कि वैश्विक कार्य window ऑब्जेक्ट की विधि की तरह है।

This QuirksMode page जब मैं इसके बारे में सीख रहा था तो मेरी मदद की।

5

जबकि अन्य उत्तर this कीवर्ड के बारे में आपके प्रश्न के साथ सौदा करते हैं, तो वे आपके प्रश्न का उत्तर नहीं देते कि apply का उपयोग क्यों किया जा रहा है। यहां किकर है: apply का उपयोग उस उदाहरण में this कीवर्ड सेट करने के लिए नहीं किया जा रहा है। इसके बजाय, इसका उपयोग arguments को done और fail फ़ंक्शंस के तर्क के रूप में पास करने के लिए किया जा रहा है।

var x = { 
    a: function(a1, a2, a3) { 
     console.log(a1, a2, a3); 
    } 
} 

function callA() { 
    x.a.apply(x, arguments); 
    x.a(arguments); 
} 

callA('red', 'blue', 'green'); 

आप इस कोड निष्पादित यदि आप x.a.apply(x, arguments); और x.a(arguments); के बीच अंतर देखना चाहिए:

इस उदाहरण लें। पहले में, a1, a2, और a3 संबंधित रंग "लाल", "नीला", और "हरा" हैं। दूसरे में, a1 एक सरणी जैसी वस्तु [ "red", "blue", "green" ] और a2 और a3undefined हैं।

इसी प्रकार, आपके पोस्ट उदाहरण में applyarguments ऑब्जेक्ट को सही ढंग से पास करने के लिए उपयोग किया जा रहा है, this कीवर्ड सेट करने के लिए नहीं।

+0

+1, क्षमा करें यह स्वीकार्य नहीं हो सकता है, लेकिन एस्सेलिया को पहले मिला (साथ ही उसने बाध्य वस्तुओं का उल्लेख किया)। हालांकि मैं वास्तव में स्पष्टता की सराहना करता हूं, और उम्मीद करता हूं कि आपका कोड नमूना दूसरों को वास्तविक प्रश्न को समझने में आपकी सहायता कर सकता है :) – Raffaele

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