कुछ फ़ंक्शन कॉल को जावास्क्रिप्ट में "अवैध इनवोकेशन" क्यों कहा जाता है?


96

उदाहरण के लिए, यदि मैं ऐसा करता हूं:

var q = document.querySelectorAll;

q('body');

मुझे क्रोम में "अवैध मंगलाचरण" त्रुटि मिलती है। मैं किसी भी कारण के बारे में सोच नहीं सकता कि यह क्यों आवश्यक है। एक के लिए, यह सभी मूल कोड फ़ंक्शन के मामले में नहीं है। वास्तव में मैं यह कर सकता हूं:

var o = Object; // which is a native code function

var x = new o();

और सब कुछ ठीक काम करता है। विशेष रूप से मैंने दस्तावेज़ और कंसोल के साथ काम करते समय इस समस्या का पता लगाया है। कोई विचार?




जवाबों:


157

ऐसा इसलिए है क्योंकि आप फ़ंक्शन का "संदर्भ" खो चुके हैं।

जब तुमने फोन किया:

document.querySelectorAll()

समारोह का संदर्भ है document, और के रूप में सुलभ हो जाएगाthis उस पद्धति के कार्यान्वयन के ।

जब आप कहते हैं qकि अब कोई संदर्भ नहीं है - यह "वैश्विक" windowवस्तु है।

querySelectorAllउपयोग करने की कोशिश करता है, thisलेकिन यह अब एक DOM तत्व नहीं है, यह एक Windowवस्तु है। कार्यान्वयन एक DOM तत्व की कुछ विधि को कॉल करने की कोशिश करता है जो एक Windowवस्तु पर मौजूद नहीं है और दुभाषिया अनिश्चित रूप से बेईमानी से कॉल करता है।

इसे हल करने के लिए, .bindजावास्क्रिप्ट के नए संस्करणों में उपयोग करें:

var q = document.querySelectorAll.bind(document);

जो यह सुनिश्चित करेगा कि सभी बाद के आक्रमणों का qसही संदर्भ हो। यदि आपको नहीं मिला है .bind, तो इसका उपयोग करें:

function q() {
    return document.querySelectorAll.apply(document, arguments);
}

3
ओह, अच्छी कॉल। आप सही हैं क्योंकि मैं कर सकता हूं: q.apply (दस्तावेज़, ['शरीर']); और यह काम करता है।
user1152187

ध्यान दें कि यह IE में अंतर्निहित कार्यों के लिए आवश्यक कार्य नहीं करता है। उदाहरण के लिए, कंसोल .log में एक लागू विधि नहीं है।
हुगोमग

@Alnitak: हाँ, यह IE को छोड़कर हर जगह काम करता है और यही कारण है कि आपको अक्सर तर्क को सामान्य रूप से पारित करना चाहिए, जैसे कि function q(x){ return document.querySelectorAll(x); }। एक और बात जो मुझे वास्तव में IE ब्राउज़र ऑब्जेक्ट्स के बारे में पसंद है, वह यह है कि उनमें से कुछ एक अपवाद को फेंक देते हैं यदि आप उनसे एक संपत्ति पढ़ने की कोशिश करते हैं, तो आपको if( 'funcname' in browserobject)सामान्य के बजाय सुविधाओं के साथ परीक्षण करने की आवश्यकता है if(browserobject.funcname)!
होजोमग

उत्कृष्ट जवाब, मैं वास्तव में इस घटना से उलझन में था, ओपी जैसी ही स्थिति।
temporary_user_name

1
होश उड़ जाना। धन्यवाद।
आरबी-

1

मेरे मामले में तर्क के रूप में कार्य करने के लिए अघोषित चर पारित करने के कारण अवैध आह्वान हुआ। कार्य करने के लिए पारित करने से पहले चर घोषित करना सुनिश्चित करें।


वैरिएबल घोषित करने से इस विशेष मामले का कोई मतलब नहीं होगा क्योंकि गैरकानूनी आह्वान हो रहा है क्योंकि डोम डिपेंडेंट मेथड को DOM के संदर्भ से बाहर कहा जा रहा है, क्योंकि जिस क्षण आप q = document करते हैं। somethingविधि के अनुसार दस्तावेज़ का संदर्भ खो देता है
अंशुल साहनी


0

एक और संक्षिप्त समाधान:

const q=s=>document.querySelectorAll(s);
q('body');
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.