जावास्क्रिप्ट "बिना पढ़े टाइपरोर: ऑब्जेक्ट एक फ़ंक्शन नहीं है" संबद्धता प्रश्न


92

कोड इस प्रकार है:

<body>
    <a href="javascript:;" id="test">hello</a>
</body>

<script type="text/javascript">
    document.getElementById("test").addEventListener("click", function () {
      test()
    }, false)
    function test() {
      var postTypes = new Array('hello', 'there')   
      (function() { alert('hello there') })()
    }
</script>

यह फेंक देगा:

"बिना पढ़ा हुआ टाइपर: ऑब्जेक्ट एक फ़ंक्शन नहीं है"

अगर मैं किसी अन्य सेट कोष्ठक में अनाम फ़ंक्शन कॉल / आह्वान को लपेटता हूं तो यह अलर्ट निष्पादित करेगा, लेकिन फिर भी मुझे एक त्रुटि देगा। अगर मैं "var postTypes" परिभाषा के बाद एक अर्ध-उपनिवेश लगाता हूं तो यह पूरी तरह से ठीक हो जाएगा।

मुझे यह विश्वास करने के लिए प्रेरित किया गया था कि जावास्क्रिप्ट को अर्ध-कॉलनों की आवश्यकता नहीं है, इसलिए मैं यह अनुमान लगा रहा हूं कि फ़ंक्शन अनुप्रयोग के कुछ अजीब सहयोगी नियम हैं जो मैं पूरी तरह से समझ नहीं रहा हूं। क्यों यह त्रुटि आ रही है?


लगभग ऐसा लगता है जैसे आप एक अनाम फ़ंक्शन और स्थिर फ़ंक्शन दोनों बनाने की कोशिश कर रहे हैं और इसे एक के रूप में निष्पादित करने की अपेक्षा कर रहे हैं। यदि आप फ़ंक्शन ()
— brumScouse

जवाबों:


85

जावास्क्रिप्ट को अर्धविराम की आवश्यकता होती है, यह सिर्फ इतना है कि दुभाषिया उन्हें आपके लिए लाइन ब्रेक पर जहां संभव हो * सम्मिलित करेगा ।

दुर्भाग्य से, कोड

var a = new B(args)(stuff)()

करता नहीं एक सिंटैक्स त्रुटि में परिणाम है, इसलिए कोई ;सम्मिलित किया जाएगा। (एक उदाहरण जो चल सकता है

var answer = new Function("x", "return x")(function(){return 42;})();

इस तरह के आश्चर्य से बचने के लिए, अपने आप को हमेशा एक बयान के साथ प्रशिक्षित करें ;।


* यह सिर्फ अंगूठे का नियम है और हमेशा सच नहीं होता है। सम्मिलन नियम बहुत अधिक जटिल है। अर्धविराम प्रविष्टि के बारे में इस ब्लॉग पृष्ठ में अधिक विवरण है।


13
या: इस तरह से आश्चर्य से बचने के लिए, अपने आप को साफ पठनीय कोड लिखने के लिए प्रशिक्षित करें (जो हमेशा लागू होना चाहिए) और सामान्य एएसआई नियमों को जानना चाहिए ... यह वास्तव में "जानने" से अलग नहीं है कि जेएस काम में कैसे बंद होता है।

18

आपका कोड एक ऐसे मामले का अनुभव करता है जहां स्वचालित अर्धविराम प्रविष्टि (ASI) प्रक्रिया नहीं होती है।

आपको कभी भी एएसआई पर भरोसा नहीं करना चाहिए। आपको सेमीकोलोन का उपयोग ठीक से अलग बयानों के लिए करना चाहिए:

var postTypes = new Array('hello', 'there'); // <--- Place a semicolon here!!

(function() { alert('hello there') })();

आपका कोड वास्तव में सरणी ऑब्जेक्ट को लागू करने की कोशिश कर रहा था।


समस्या को ठीक करने का एक तरीका है, लेकिन मैं क्रॉकफोर्ड-क्लब के पीछे नहीं जा सकता।

1
@ पीएसटी: मुझे रेफर करने दो, मैं क्रॉक-क्लब में बिल्कुल नहीं हूं :)
— क्रिश्चियन सी। साल्वाडोर

उस मामले में मैं कठोर शब्दों के लिए माफी माँगता हूँ :(

मैंने क्विज का आनंद लिया। एएसआई वास्तव में icky-code के साथ बहुत भ्रामक है!

8

मुझे एक समान त्रुटि मिली और मुझे यह महसूस करने में थोड़ा समय लगा कि मेरे मामले में मैंने सरणी चर payInvoices का नाम दिया है और फ़ंक्शन भी payInvoices। इसने एंगुलरज को भ्रमित कर दिया। एक बार जब मैंने नाम को प्रोसेसपेयमेंट्स में बदल दिया () तो आखिरकार यह काम कर गया। बस इस त्रुटि और समाधान को साझा करना चाहता था क्योंकि मुझे यह पता लगाने में बहुत समय लगा।


यहाँ भी, मेरे पास एक चर नाम alertथा और जावास्क्रिप्ट अलर्ट फ़ंक्शन को कॉल करने की कोशिश कर रहा था और यह कहेगा कि 'अलर्ट एक फ़ंक्शन नहीं है'। यह alertवास्तविक कार्य के बजाय चर को कॉल करने की कोशिश कर रहा था
— जेम्स ११

0

अपनी जावास्क्रिप्ट फ़ाइल में फ़ंक्शन कॉल से पहले फ़ंक्शन बॉडी रखने का प्रयास करें।


0

मैं एक ही त्रुटि हो रही थी और एक दिन और एक समाधान खोजने की कोशिश कर एक दिन बिताया। नाओमी का जवाब मुझे उस समाधान की ओर ले जाता है जिसकी मुझे ज़रूरत थी।

मेरे इनपुट (प्रकार = बटन) में एक विशेषता थी जो nameएक फ़ंक्शन नाम के समान थी जिसे ऑनक्लिक इवेंट द्वारा बुलाया जा रहा था। एक बार जब मैंने विशेषता बदल दी तो nameसब कुछ काम कर गया।

<input type="button" name="clearEmployer" onClick="clearEmployer();">

में परिवर्तित किया गया:

<input type="button" name="clearEmployerBtn" onClick="clearEmployer();">

0

टीएस को वेबपैक के साथ संकलन और बंडल करते समय मेरे पास यह त्रुटि है। इसमें वह संकलित export class AppRouterElement extends connect(store, LitElement){....}है let Sr = class extends (Object(wr.connect) (fn, vr)) {....}जो अल्पविराम के लापता होने के कारण गलत लगता है। रोलअप के साथ बंडल करते समय, कोई त्रुटि नहीं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.