बिना पढ़ा हुआ टाइपError: (इंटरमीडिएट वैल्यू) (…) एक फंक्शन नहीं है


128

सब कुछ ठीक काम करता है जब मैंने एक जेएस फाइल के रूप में जेएस लॉजिक को एक क्लोजर में लिखा था, जैसे:

(function(win){
   //main logic here
   win.expose1 = ....
   win.expose2 = ....
})(window)

लेकिन जब मैं उसी js फ़ाइल में बंद होने से पहले एक लॉगिंग वैकल्पिक फ़ंक्शन सम्मिलित करने का प्रयास करता हूं,

 window.Glog = function(msg){
     console.log(msg)
 }
 // this was added before the main closure.

 (function(win){
   //the former closure that contains the main javascript logic;
 })(window)

यह शिकायत करता है कि एक टाइपर्रर है:

Uncaught TypeError: (intermediate value)(...) is not a function

मैंने गलत क्या किया?

जवाबों:


275

तीसरी पंक्ति में लापता अर्धविराम का परिणाम त्रुटि है:

window.Glog = function(msg) {
  console.log(msg);
}; // <--- Add this semicolon

(function(win) {
  // ...
})(window);

ECMAScript विनिर्देश में स्वचालित अर्धविराम सम्मिलन के लिए विशिष्ट नियम हैं , हालांकि इस मामले में एक अर्धविराम स्वचालित रूप से डाला नहीं जाता है क्योंकि अगली पंक्ति पर शुरू होने वाले कोष्ठक अभिव्यक्ति को फ़ंक्शन कॉल के लिए तर्क सूची के रूप में व्याख्या किया जा सकता है।

इसका मतलब यह है कि उस अर्धविराम के बिना, अनाम window.Glogफ़ंक्शन को msgपैरामीटर के रूप में एक फ़ंक्शन के साथ आमंत्रित किया जा रहा था , जिसके (window)बाद बाद में जो कुछ भी लौटाया गया था उसे आह्वान करने का प्रयास किया गया था।

इस तरह कोड की व्याख्या की जा रही थी:

window.Glog = function(msg) {
  console.log(msg);
}(function(win) {
  // ...
})(window);

4
@armnotstrong जोश तेज़ था, और इसका उत्तर भी वही है :)
mrlew

1
धन्यवाद महोदय! मेरे लिंटर ने अर्धविराम को
स्वचालित रूप से

1
बहुत बढ़िया!!! बहुत बहुत धन्यवाद!! मैंने इस पर अपने सारे बाल लगभग खो दिए ...
TMS

1
यह, मेरे दोस्त, सोना है!
LihO

1
यह पागल है और मैं इस पोस्ट के लिए बहुत आभारी हूं। मैं ifएक प्रतिक्रिया useEffect()समारोह में एक बयान के बाद राज्य स्थापित कर रहा था जब मैं इसे प्राप्त करता रहा "... एक फ़ंक्शन नहीं है" त्रुटि।
राहुल नाथ

7

अर्धविराम नियमों को सरल बनाने के लिए

प्रत्येक पंक्ति (, जो [, `, या किसी भी ऑपरेटर (/, +, - केवल मान्य हैं) से शुरू होती है, अर्धविराम से शुरू होनी चाहिए।

func()
;[0].concat(myarr).forEach(func)
;(myarr).forEach(func)
;`hello`.forEach(func)
;/hello/.exec(str)
;+0
;-0

यह एक रोकता है

func()[0].concat(myarr).forEach(func)(myarr).forEach(func)`hello`.forEach(func)/hello/.forEach(func)+0-0

monstrocity।

अतिरिक्त नोट

क्या होगा इसका उल्लेख करने के लिए: कोष्ठक सूचकांक होगा, कोष्ठक को फ़ंक्शन मापदंडों के रूप में माना जाएगा। बैकटिक एक टैग किए गए टेम्प्लेट में बदल जाएगा , और रेगेक्स या स्पष्ट रूप से हस्ताक्षरित पूर्णांक ऑपरेटरों में बदल जाएंगे। बेशक, आप बस हर पंक्ति के अंत में एक अर्धविराम जोड़ सकते हैं। यह ध्यान में रखना अच्छा है कि जब आप जल्दी से प्रोटोटाइप कर रहे हैं और अपने अर्धविराम को छोड़ रहे हैं।

इसके अलावा, हर पंक्ति के अंत में अर्धविराम जोड़ने से आपको निम्नलिखित में मदद नहीं मिलेगी, इसलिए जैसे बयानों को ध्यान में रखें

return // Will automatically insert semicolon, and return undefined.
    (1+2);
i // Adds a semicolon
   ++ // But, if you really intended i++ here, your codebase needs help.

उपरोक्त मामला वापसी / जारी / तोड़ने / ++ / - करने के लिए होगा। कोई भी लिंटर इसे मृत-कोड या ++ / - सिंटैक्स त्रुटि (++ / - के साथ वास्तविक रूप से कभी नहीं होगा) को पकड़ेगा।

अंत में, यदि आप काम करने के लिए फ़ाइल कॉन्सेप्टन चाहते हैं, तो सुनिश्चित करें कि प्रत्येक फ़ाइल अर्धविराम के साथ समाप्त होती है। यदि आप एक बंडल प्रोग्रामर (अनुशंसित) का उपयोग कर रहे हैं, तो इसे स्वचालित रूप से करना चाहिए।


5

त्रुटि मामला:

var userListQuery = {
    userId: {
        $in: result
    },
    "isCameraAdded": true
}

( cameraInfo.findtext != "" ) ? searchQuery : userListQuery;

आउटपुट:

TypeError: (intermediate value)(intermediate value) is not a function

फिक्स: आप भावों को अलग करने के लिए एक अर्ध-उपनिवेश (;) याद कर रहे हैं

userListQuery = {
    userId: {
        $in: result
    },
    "isCameraAdded": true
}; // Without a semi colon, the error is produced

( cameraInfo.findtext != "" ) ? searchQuery : userListQuery;

3

मेरे लिए यह बहुत अधिक सरल था लेकिन मुझे यह पता लगाने में थोड़ा समय लगा। हम मूल रूप से हमारे .jslib में थे

some_array.forEach(item => {
    do_stuff(item);
});

एकता (ईम्स्क्रिप्ट)? हमने इसे एक पुराने पुराने लूप से बदल दिया और यह तुरंत शिकायत करना बंद कर दिया। मैं वास्तव में इसे नफरत करता हूं कि यह उस रेखा को नहीं दिखाता है जिसके बारे में शिकायत की जा रही है, लेकिन वैसे भी, मुझ पर दो बार शर्म करो।


मेरा अनुमान है कि अपनी समस्या के साथ कुछ करने के लिए किया गया है इस
Brandito

यह एक अलग मामला है कि सवाल क्या है।
चेरीडीटी

@CherryDT यह नहीं है, क्योंकि मुझे जो त्रुटि मिल रही थी, वही सटीक थी।
tfrascaroli

नहीं, यह प्रश्न उन त्रुटियों के बारे में है जो आप गलती से किसी फ़ंक्शन को स्टेटमेंट और (अगली पंक्ति के बीच मौजूद अर्धविराम के कारण फ़ंक्शन के रूप में कॉल करते हैं। मुझे आपके मामले में कोई भी दिखाई नहीं दे रहा है। सवाल केवल अपने शीर्षक से मिलकर नहीं है!
चेरीडीटी

1

मुझे इस मुद्दे का सामना करना पड़ा जब मैंने एक नया ES2015 वर्ग बनाया जहां संपत्ति का नाम विधि नाम के बराबर था।

उदाहरण के लिए:

class Test{
  constructor () {
    this.test = 'test'
  }

  test (test) {
    this.test = test
  }
}

let t = new Test()
t.test('new Test')

कृपया ध्यान दें कि यह कार्यान्वयन NodeJS 6.10 में था।

वर्कअराउंड के रूप में (यदि आप उबाऊ 'सेटटेस्ट' विधि नाम का उपयोग नहीं करना चाहते हैं), तो आप अपने 'निजी' गुणों (जैसे _test) के लिए एक उपसर्ग का उपयोग कर सकते हैं ।

अपने डेवलपर टूल को jsfiddle में खोलें ।


यह एक अलग मामला है कि सवाल क्या है।
चेरीडीटी

0
  **Error Case:**

var handler = function(parameters) {
  console.log(parameters);
}

(function() {     //IIFE
 // some code
})();

आउटपुट: TypeError: (इंटरमीडिएट वैल्यू) (इंटरमीडिएट वैल्यू) एक फंक्शन नहीं है * How to Fix IT -> क्योंकि आप एक्सप्रेशन को अलग करने के लिए सेमी कोलान (;) मिस कर रहे हैं।

 **Fixed**


var handler = function(parameters) {
  console.log(parameters);
}; // <--- Add this semicolon(if you miss that semi colan .. 
   //error will occurs )

(function() {     //IIFE
 // some code
})();

यह त्रुटि क्यों आती है ?? कारण: स्वचालित अर्धविराम सम्मिलन के लिए विशिष्ट नियम जो ES6 स्टैनर्ड दिए गए हैं


0

जब मैं एक रूट क्लास बनाता हूं, जिसके तरीके मैंने एरो फ़ंक्शंस का उपयोग करके परिभाषित किए हैं। जब मूल कार्य विरासत में मिला और ओवरराइट किया तो मैंने उसी मुद्दे को देखा।

class C {
  x = () => 1; 
 };
 
class CC extends C {
  x = (foo) =>  super.x() + foo;
};

let add = new CC;
console.log(add.x(4));

यह तीर के कार्यों के बिना मूल वर्ग की विधि को परिभाषित करके हल किया गया है

class C {
  x() { 
    return 1; 
  }; 
 };
 
class CC extends C {
  x = foo =>  super.x() + foo;
};

let add = new CC;
console.log(add.x(4));
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.