আনকড টাইপ এরির: (মধ্যবর্তী মান) (…) কোনও ফাংশন নয়


128

যখন আমি একক জেএস ফাইল হিসাবে বন্ধে জেএস যুক্তিটি লিখেছিলাম তখন সবকিছু ঠিকঠাক কাজ করে:

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

কিন্তু যখন আমি একই জেএস ফাইলটিতে বন্ধ হওয়ার আগে লগিং বিকল্প ফাংশন sertোকানোর চেষ্টা করি,

 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);

ইসমাস্ক্রিপ্ট স্পেসিফিকেশনের স্বয়ংক্রিয় সেমিকোলন সন্নিবেশের জন্য সুনির্দিষ্ট বিধি রয়েছে , তবে এই ক্ষেত্রে একটি সেমিকোলন স্বয়ংক্রিয়ভাবে sertedোকানো হয় না কারণ পরের লাইনে শুরু হওয়া প্রথম বন্ধনীটি ফাংশন কলের জন্য আর্গুমেন্ট তালিকা হিসাবে ব্যাখ্যা করা যেতে পারে।

এর অর্থ হল যে সেমিকোলন ব্যতীত, বেনামে window.Glogফাংশনটি msgপ্যারামিটার হিসাবে একটি ফাংশন সহ আহ্বান করা হচ্ছিল , এরপরে (window)যা কিছু পরে ফিরে আসার অনুরোধ জানানো হয়েছিল।

কোডটি এভাবে ব্যাখ্যা করা হচ্ছিল:

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

4
@armnotstrong জোশ দ্রুত ছিল, এবং উত্তর একই :) হল
mrlew

1
ধন্যবাদ জনাব! আমার লিটারটি সেমিকোলনটি স্বয়ংক্রিয়ভাবে সরিয়ে নিয়েছিল এবং সবকিছু ভেঙে ফেলেছে :)
জোনাস লোমহোল্ড

1
অসাধারণ!!! তোমাকে অনেক ধন্যবাদ!! আমি আমার চুলটি প্রায় হারিয়ে ফেলেছি ...
টিএমএস

1
এই, আমার বন্ধু, সোনার!
LihO

1
এটি উন্মাদ এবং আমি এই পোস্টের জন্য তাই কৃতজ্ঞ। আমি ifপ্রতিক্রিয়া useEffect()ফাংশনে একটি বিবৃতি দেওয়ার পরে রাষ্ট্র নির্ধারণ করছিলাম যখন আমি এই "... প্রাপ্ত করা চালিয়ে যাই" ত্রুটি নয়।
রাহুল নাথ

7

সেমিকোলন বিধি সহজ করতে

একটি (,, [`, বা যে কোনও অপারেটর (/, +, - একমাত্র বৈধ পংক্তিতে) দিয়ে শুরু হওয়া প্রতিটি লাইন অবশ্যই একটি সেমিকোলন দিয়ে শুরু হওয়া উচিত।

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

এটি প্রতিরোধ করে a

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

প্রশ্নটি যা হয় তার চেয়ে এটি আলাদা একটি মামলা।
চেরিডিটি

@ চেরিডিটি এটি নয়, যেহেতু আমি যে ত্রুটিটি পাচ্ছিলাম ঠিক সেটাই ছিল।
tfrascaroli

না, এই প্রশ্নটি ত্রুটি সম্পর্কিত যেটি আপনি (পরের লাইনে স্টেটমেন্ট এবং এর মধ্যে একটি সেমিকোলন বিদ্যমান না থাকার কারণে ঘটনাক্রমে কোনও ক্রিয়াকলাপ হিসাবে কিছু বলা থেকে পেয়েছেন । আপনার ক্ষেত্রে আমি এর কোনও কিছুই দেখতে পাচ্ছি না। প্রশ্নটি কেবল তার শিরোনাম নিয়ে গঠিত নয়!
চেরিডিটি

1

যখন আমি একটি নতুন ES2015 শ্রেণি তৈরি করেছি যেখানে সম্পত্তিটির নাম পদ্ধতির নামের সমান ছিল তখন আমি এই সমস্যার মুখোমুখি হয়েছি।

উদাহরণ:

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

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

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

দয়া করে নোট করুন এই বাস্তবায়নটি নোডজেএস 6.10 এ ছিল।

কার্যকারণ হিসাবে (আপনি যদি বোরিং 'সেটটেষ্ট' পদ্ধতির নামটি ব্যবহার করতে না চান), আপনি আপনার 'ব্যক্তিগত' বৈশিষ্ট্যগুলির জন্য একটি উপসর্গ ব্যবহার করতে পারেন (যেমন _test)।

আপনার বিকাশকারী সরঞ্জামগুলি jsfiddle এ খুলুন ।


প্রশ্নটি যা হয় তার চেয়ে এটি আলাদা একটি মামলা।
চেরিডিটি

0
  **Error Case:**

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

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

আউটপুট: প্রকারের ত্রুটি: (মধ্যবর্তী মান) (মধ্যবর্তী মান) কোনও ফাংশন নয় * আইটি কীভাবে ঠিক করবেন -> কারণ আপনি পৃথক প্রকাশের জন্য আধা কোলান (;) অনুপস্থিত;

 **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));
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.