2012-05-24 8 views
50

उदाहरण के लिए, अगर मैं इस कार्य करें:जावास्क्रिप्ट में कुछ फ़ंक्शन कॉल को "अवैध आमंत्रण" क्यों कहा जाता है?

var q = document.querySelectorAll; 

q('body'); 

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

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

var x = new o(); 

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

+0

संभावित डुप्लिकेट [क्यों कोई दस्तावेज़ के लिए उपनाम सेट नहीं कर सकता .getElementById()?] (Http://stackoverflow.com/questions/10723496/why-cant-one-set-an-alias-to- दस्तावेज़-getelementbyid) – Quentin

+1

[जावास्क्रिप्ट फ़ंक्शन एलियासिंग काम करने के लिए प्रतीत नहीं होता है] के संभावित डुप्लिकेट [http://stackoverflow.com/questions/1007340/javascript-function-aliasing-doesnt-seem-to-work) – HoLyVieR

+0

सटीक डुप्लिकेट ["अनकॉट टाइप एरर: क्रोम में अवैध आमंत्रण"] (http://stackoverflow.com/questions/9677985/uncaught-typeerror-illegal-invocation-in-chrome) –

उत्तर

86

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

जब आप फोन:

document.querySelectorAll() 

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

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

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

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

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

जो यह सुनिश्चित करेंगे कि q के बाद के सभी आमंत्रण सही संदर्भ है। तर्क के रूप में कार्य करने के लिए पारित करने के अघोषित चर के कारण

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

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

+0

ध्यान दें कि यह आईई में बिल्टिन कार्यों के लिए जरूरी काम नहीं करता है। उदाहरण के लिए, console.log में कोई लागू विधि नहीं है। – hugomg

+0

@missingno यह क्रोम पर ठीक है - अभी तक एक और आईई "विशेष" मुझे लगता है - आह ... – Alnitak

-1

मेरे मामले अवैध मंगलाचरण में आई: आप .bind नहीं मिला है, इस का उपयोग करें। फ़ंक्शन पर जाने से पहले चर घोषित करना सुनिश्चित करें।

0

यह कई कारणों से हो सकता है, सबसे आम कारण यह है कि आप कुछ ऐसा कह रहे हैं जो परिवर्तनीय और कार्य दोनों है।

<body> 
<input type="button" value="-" onclick="changeTime(this)"> 
<script> 
    var changeTime = document.getElementsByClassName("changeTimes"); 
    function changeTime(t){ 
      console.dir(t); 
     } 
</script> 
</body> 

इसलिए इस मामले में यह स्पष्ट नहीं है जो "changeTime" हम बुला रहे हैं, चर या समारोह, इसलिए "अवैध मंगलाचरण"।

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