2016-01-21 7 views
8

enter image description hereएक फ़ंक्शन है, फिर वास्तव में क्या 'a.call.call` करता है?

ये कोड क्रोम devtool पर चलाए जाते हैं।

ऐसा लगता है कि b.call (a.call.call के समान) पहला तर्क कह रहा है, जो एक फ़ंक्शन है, फिर दूसरा तर्क this के रूप में पास करें। यदि पहला तर्क फ़ंक्शन नहीं है, तो not a function त्रुटि फेंक दें।

कोई बता सकता है कि कैसे <Function>.call.call काम करते हैं?

+0

"[दस्तावेज के युद्धपोत] (http://meta.stackoverflow.com/q/303865/419956)" a.k.a. "NullReference" अभी तक यहां नहीं है, जब तक कि आपका प्रश्न शायद थोड़ा अधिक व्यापक न हो। तब तक, मैं [MDN] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Function/call) जैसे अन्य संसाधनों की अनुशंसा करता हूं। – Jeroen

+0

@ जेरोइन मैंने पहले ही एमडीएन पर उस दस्तावेज़ को पढ़ा है, लेकिन यह बताता है कि 'कॉल' फ़ंक्शन कैसे काम करता है, और कुछ उदाहरण देता है। मैं वास्तव में यहां क्या कहता हूं 'call.call' है, जिसका व्यवहार' कॉल 'से अलग है। और मैं 'call.call' के पीछे काम नहीं कर सकता। – tjfdfs

+1

'.call()' का पहला तर्क वह ऑब्जेक्ट है जिसे आप उस कॉल में 'this' मान के रूप में सेट करना चाहते हैं जिसे 'कॉल()' चालू करना है। यदि 'कॉल()' स्वयं ही कार्य करने के लिए फ़ंक्शन है क्योंकि आपने '.call.call() 'जंजीर' '' मूल्य के साथ क्या किया है? यह मानता है कि यह एक समारोह है और इसे कॉल करने का प्रयास करता है। लेकिन कोड की आपकी आखिरी पंक्ति फ़ंक्शन पास नहीं करती है, यह एक खाली ऑब्जेक्ट पास करती है। – nnnnnn

उत्तर

8

सही मैं आपको एक उदाहरण दिखा है।

function a() { console.log(1) } 

function b() { console.log(2) } 

a.call(b) // 1 

a.call.call(b) // 2 

a.call.call.call(b) // 2 

क्यों?

हम जानते हैं a.call(b) साधन आह्वान a()के साथ इस मूल्य b

ताकि a.call.call(b) साधन साथ Function.prototype.call() आह्वान इस मूल्य ख, Function.prototype.call.call(b) के रूप में ही।

लेकिन Function.prototype.call.call() एक सामान्य कार्य वस्तु नहीं है। इसे बुलाया जा सकता है लेकिन इसमें कोई संपत्ति नहीं है। कुछ अद्वितीय नियम इसे आमंत्रित करने के लिए हैं।

Function.prototype.call.call(a) // 1 

Function.prototype.call.call(b) // 2 

वास्तव में, Function.prototype.call.call(b) एक विदेशी वस्तु, इसके अलावा, एक बाउंड समारोह विदेशी वस्तु है।

  • [विशिष्टता] एक बाध्य कार्य एक विदेशी वस्तु है जो किसी अन्य कार्य वस्तु को लपेटती है।

  • [विशिष्टता] एक बाध्य समारोह को कॉल करना आम तौर पर इसके लपेटे हुए फ़ंक्शन की कॉल में परिणाम देता है।

ताकि Function.prototype.call.call(a) बस a() का मतलब है।

a.call.call(x) का अर्थ है एक्स, यानी x()

  • [विशिष्टता] Function.prototype.call(thisArg) में, यदि thisArg अपरिभाषित या नल है, यह वैश्विक वस्तु से बदल दिया जाएगा।

a.call.call() मतलब है a.call.call(undefined) मतलब है a.call.call(window) साधन आह्वान window

window आह्वान करने के लिए आप Uncaught TypeError: window is not a function मिल जाएगा, तो a.call.call() आह्वान करने के लिए आप Uncaught TypeError: a.call.call is not a function मिलेगा कोशिश की कोशिश करो।

उम्मीद है कि यह मदद करता है।

1

बुनियादी सामान से शुरू,

.call क्या है? इसका एक समारोह Function.prototype के अंदर उपलब्ध है। ताकि इसे किसी भी फ़ंक्शन पर बुलाया जा सके, यही कारण है कि आप a.call पर कॉल करने में सक्षम हैं।

अब, .call क्या करता है? यह .call पर फ़ंक्शन पर this संदर्भ सेट करता है। इसलिए आपके मामले में, जब आप a.call पर कॉल करते हैं तो यह फ़ंक्शन a पर संदर्भित कर सकता है (पहले पैरामीटर के माध्यम से आप .call फ़ंक्शन पर जाते हैं)।

this.call फ़ंक्शन के अंदर क्या है? यह लेकिन समारोह आप पर .call कहा जाता है कुछ भी नहीं है (अपने मामले a में),
है तो सादगी के लिए आप मान, .call अंदर यह this() तरह फ़ंक्शन को कॉल किया जा सकता है (और है कि a() बुला लेकिन कुछ भी नहीं है) - अब तक तो अच्छा

अपने प्रश्न

a.call.call 

यहाँ क्या हो रहा है के लिए? दूसरा .call (मैं बाएं से दाएं गिन रहा हूं) पहले .call पर कॉल कर रहा है और पहले .call के लिए this सेट कर रहा है, जो कि पहले पैरामीटर के अलावा कुछ भी नहीं है, जो एक फ़ंक्शन है।

अब पहले .callthis() फोन करेगा (याद इस दूसरे .call द्वारा निर्धारित है और यह पहली परम आप पारित कर दिया है और यह एक समारोह है)।

मुझे उम्मीद है कि मैं समझा सकता हूं कि मैं क्या समझाना चाहता हूं।

मुझे बताएं कि आप a.call.call के साथ क्यों उलझन में हैं। ऐसा इसलिए है क्योंकि आप सोच रहे हैं कि मेरे फ़ंक्शन a इस भ्रम में कहाँ गए? जो वास्तव में के रूप में यो फोन दूसरा .call

आप मामले .call.callFunction.prototype या Object पर बुलाया गया है चाहिए में (यहाँ this पहले .call से पीछे नहीं .call जो इस मामले में अपने कार्य a अप्रचलित बनाता है से आ रही है) के रूप में जल्द ही शामिल नहीं या किसी अन्य समारोह (याद .callFunction.prototype का हिस्सा है और किसी भी समारोह पर कहा जा सकता है)

ताकि आप

Function.prototype.call.call(...) 
किया जाना चाहिए

या यहाँ तक कि

Object.call.call(...) 

अब मैं पिछले सप्ताह (नहीं .call.call लेकिन .call.bind) इन बात के बारे में उलझन में था, मैं एक सवाल यहां कहा, और किसी को बहुत विस्तृत में मेरे लिए यह बताया गया है, आप इसे पा सकते हैं HERE

मैंने मुझसे पूछे गए प्रश्न से मेरी समझ से जवाब देने का प्रयास किया।

आप सवाल "यह b.call की तरह (a.call.call के रूप में ही) लगता है पहला तर्क बुला रहा है, जो:

इस सब के बाद क्या एसओ के लिए

अद्यतन है एक फ़ंक्शन, फिर दूसरा तर्क इस तरह से पास करें। यदि पहला तर्क फ़ंक्शन नहीं है, तो फ़ंक्शन त्रुटि फेंक दें। "

अपने धारणा यहाँ

+0

धन्यवाद! कुछ विचार पाने के लिए मैं आपके उत्तर और लिंक दो बार पढ़ूंगा। – tjfdfs

+0

और आपकी धारणा सही है और, मैंने – Oxi

+0

पर कब्जा करने के लिए अपना उत्तर अपडेट किया है कृपया इसे एक उदाहरण के साथ जोड़ें जो समझने में आसान होगा। –

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