আমি আমার কনসোলটিতে এই জাভাস্ক্রিপ্ট ত্রুটি পেয়েছি:
আনকাচড সিনট্যাক্স এরিয়ার: অপ্রত্যাশিত টোকেন ইলিজেল
এটি আমার কোড:
var foo = 'bar';
এটি দেখতে খুব সহজ as এটি কীভাবে সিন্ট্যাক্স ত্রুটির কারণ হতে পারে?
আমি আমার কনসোলটিতে এই জাভাস্ক্রিপ্ট ত্রুটি পেয়েছি:
আনকাচড সিনট্যাক্স এরিয়ার: অপ্রত্যাশিত টোকেন ইলিজেল
এটি আমার কোড:
var foo = 'bar';
এটি দেখতে খুব সহজ as এটি কীভাবে সিন্ট্যাক্স ত্রুটির কারণ হতে পারে?
উত্তর:
কোডটি জাভাস্ক্রিপ্ট দোভাষী দ্বারা বিশ্লেষণ করা হলে, এটি "টোকেন" নামে টুকরো টুকরো হয়ে যায়। যখন একটি টোকেনকে চারটি বেসিক টোকেন ধরণের মধ্যে শ্রেণীবদ্ধ করা যায় না, বেশিরভাগ বাস্তবায়নের উপর এটি "ILLEGAL" লেবেলযুক্ত হয় এবং এই ত্রুটি নিক্ষেপ করা হয়।
একই ত্রুটি উত্থাপিত হয়, উদাহরণস্বরূপ, আপনি যদি দুর্বৃত্ত @
চরিত্র, একটি বিভক্ত কোঁকড়ানো ধনুর্বন্ধনী, বন্ধনী, "স্মার্ট উদ্ধৃতি", একক উদ্ধৃতি সঠিকভাবে আবদ্ধ না হয় (উদাহরণস্বরূপ this.run('dev1)
) ইত্যাদির সাহায্যে জেএস ফাইল চালানোর চেষ্টা করেন।
বিভিন্ন পরিস্থিতিতে অনেকগুলি এই ত্রুটি ঘটাতে পারে। তবে আপনার যদি স্পষ্টত বাক্য গঠন ত্রুটি বা অবৈধ চরিত্র না থাকে তবে এটি অদৃশ্য অবৈধ চরিত্রের কারণে ঘটতে পারে । এই উত্তর সম্পর্কে যা হয়।
কোডটিতে একটি অদৃশ্য চরিত্র রয়েছে, সেমিকোলনের ঠিক পরে। এটি ইউনিকোড U+200B
জিরো-প্রস্থের স্থানের অক্ষর (ওরফে ZWSP
, এইচটিএমএল সত্তা ​
)। এই চরিত্রটি Unexpected token ILLEGAL
জাভাস্ক্রিপ্ট সিনট্যাক্স ত্রুটির কারণ হিসাবে পরিচিত ।
আমি নিশ্চিত করে বলতে পারছি না, তবে আমার বাজিটি jsfiddle এ আছে । আপনি যদি সেখান থেকে কোডটি পেস্ট করেন তবে এটির মধ্যে সম্ভবত এক বা একাধিক U+200B
অক্ষর অন্তর্ভুক্ত রয়েছে । দেখে মনে হচ্ছে দীর্ঘ অক্ষরে শব্দ-মোড়ানো নিয়ন্ত্রণ করার জন্য সরঞ্জামটি সেই অক্ষরটি ব্যবহার করে।
আপডেট 2013-01-07
সর্বশেষ জেসফিডাল আপডেটের পরে , এটি এখন কোডেপেনের মতো লাল বিন্দুর মতো চরিত্রটি দেখাচ্ছে । স্পষ্টতই , এটি
U+200B
নিজের নিজের থেকে অক্ষরগুলি সন্নিবেশও করছে না, এখন থেকে এই সমস্যাটি কম ঘন ঘন হওয়া উচিত।আপডেট 2015-03-17
ভার্চুয়ালবক্সে বাগের কারণে মাঝে মাঝে ভ্যাগ্র্যান্ট এই সমস্যাটি দেখা দেয় । এই ব্লগ পোস্ট অনুসারে সমাধানটি হ'ল
sendfile off;
আপনার এনজিএনএক্স কনফিগারেশনে সেট করা বাEnableSendfile Off
আপনি যদি অ্যাপাচি ব্যবহার করেন।
এটি আরও জানা গেছে যে ক্রোম বিকাশকারী সরঞ্জামগুলি থেকে আটকানো কোডটিতে সেই চরিত্রটি অন্তর্ভুক্ত থাকতে পারে তবে আমি বর্তমান সংস্করণ (ওএসএক্সে 22.0.1229.79) সহ এটি পুনরুত্পাদন করতে পারিনি।
চরিত্রটি অদৃশ্য, কীভাবে আমরা জানি যে এটি সেখানে রয়েছে? আপনি আপনার সম্পাদককে অদৃশ্য অক্ষরগুলি প্রদর্শন করতে বলতে পারেন। বেশিরভাগ পাঠ্য সম্পাদকদের এই বৈশিষ্ট্য রয়েছে। উদাহরণস্বরূপ, ভিম এগুলি ডিফল্টরূপে প্রদর্শন করে এবং এর ZWSP
মতো করে শো করে <u200b>
। আপনি এটি অনলাইনে ডিবাগও করতে পারেন: জেসবিন তার কোড প্যানে লাল বর্ণের মতো চরিত্রটি প্রদর্শন করে (তবে পৃষ্ঠাটি সংরক্ষণ এবং পুনরায় লোড করার পরে এটি মুছে ফেলা হবে বলে মনে হয়)। কোডপেন.ইও এটিকে বিন্দু হিসাবে প্রদর্শন করে এবং সংরক্ষণ করার পরেও তা রাখে।
এই চরিত্রটি খারাপ কিছু নয়, এটি আসলে বেশ কার্যকর হতে পারে। উইকিপিডিয়ায় এই উদাহরণটি প্রদর্শন করে যে এটি কীভাবে একটি দীর্ঘ স্ট্রিং পরের লাইনে আবৃত করা উচিত তা নিয়ন্ত্রণ করতে ব্যবহার করা যেতে পারে। তবে, আপনি যদি আপনার মার্কআপে চরিত্রটির উপস্থিতি সম্পর্কে অবগত না হন, এটি সমস্যা হতে পারে। যদি আপনার স্ট্রিংটির অভ্যন্তরে থাকে (উদাহরণস্বরূপ, nodeValue
কোনও ডিওএম উপাদান যার কোনও দৃশ্যমান সামগ্রী নেই) তবে আপনি আশা করতে পারেন যে এই স্ট্রিংটি খালি থাকবে, যখন বাস্তবে এটি নেই (প্রয়োগ করার পরেও String.trim
)।
ZWSP
এইচটিএমএল পৃষ্ঠায় অতিরিক্ত শ্বেত স্থান প্রদর্শিত হতে পারে, উদাহরণস্বরূপ যখন এটি দুটি <div>
উপাদানগুলির মধ্যে পাওয়া যায় (যেমন এই প্রশ্নটিতে দেখা যায় )। চরিত্রটি সেখানে উপেক্ষা করা হওয়ায় এই কেসটি জিসফিডালে পুনরুত্পাদনযোগ্যও নয়।
আর একটি সম্ভাব্য সমস্যা: যদি ওয়েব পৃষ্ঠার এনকোডিংটি ইউটিএফ -8 হিসাবে স্বীকৃতি না দেয় তবে চরিত্রটি প্রকৃতপক্ষে প্রদর্শিত হতে পারে ( ​
উদাহরণস্বরূপ লাতিন 1-তে)।
যদি ZWSP
সিএসএস কোডে উপস্থিত থাকে (ইনলাইন কোড, বা একটি বাহ্যিক স্টাইলশিট), শৈলীগুলিও সঠিকভাবে পার্স করা যায় না, তাই কিছু শৈলী প্রয়োগ করা যায় না ( এই প্রশ্নটিতে দেখা যায়) )।
ECMAScript স্পেসিফিকেশন (সংস্করণ 3 এবং 5.1 ) তে আমি সেই নির্দিষ্ট চরিত্রের কোনও উল্লেখ পাইনি । বর্তমান সংস্করণে বিভাগ 7.1 তে অনুরূপ অক্ষর ( U+200C
এবং U+200D
) উল্লেখ করা হয়েছে , যা বলে যে "মন্তব্য, স্ট্রিং লিটারাল এবং নিয়মিত প্রকাশের আক্ষরিক বাইরে" যখন সেগুলি হিসাবে বিবেচনা করা উচিত । এই অক্ষরগুলি উদাহরণস্বরূপ, একটি চলক নামের অংশ হতে পারে (এবংIdentifierPart
var x\u200c;
প্রকৃতপক্ষে কাজ করে)।
বিভাগ 7.2 বৈধ হোয়াইট স্পেস অক্ষর (যেমন ট্যাব, স্পেস, নন-ব্রেক স্পেস ইত্যাদি) তালিকাভুক্ত করে এবং অস্পষ্টভাবে উল্লেখ করেছে যে অন্য কোনও ইউনিকোড "স্পেস বিভাজক" (বিভাগ "জেডএস") সাদা স্থান হিসাবে বিবেচিত হওয়া উচিত। আমি সম্ভবত এই বিষয়ে চশমাগুলি নিয়ে আলোচনা করার জন্য সেরা ব্যক্তি নই, তবে আমার কাছে এটি U+200B
অনুযায়ী সাদা স্থান হিসাবে বিবেচনা করা উচিত বলে মনে হয় , যখন বাস্তবে বাস্তবায়নগুলি (কমপক্ষে ক্রোম এবং ফায়ারফক্স) তাদেরকে অপ্রত্যাশিত হিসাবে বিবেচনা করে টোকেন (বা এর একটি অংশ), সিনট্যাক্স ত্রুটির সৃষ্টি করে।
function
, যা ভিমে অদৃশ্য ছিল যতক্ষণ না আমি এটিকে "সমস্ত মুদ্রণযোগ্য অক্ষর হাইলাইট" FAQ পদ্ধতি ব্যবহার করে তা হাইলাইট না করি ighted আহ্ খুব ভাল লাগত যদি 32..127 এর মধ্যে কেবল অক্ষরের অনুলিপি করার কোনও উপায় থাকত (তবে সম্ভবত এটির জন্য একটি অ্যাপ্লিকেশন রয়েছে :))
আপনি কেন আপনার কোডটিতে এই সমস্যাটি খুঁজছেন? এমনকি, যদি এটি কপিপস্ট করা হয়।
যদি আপনি দেখতে পান যে সিঙ্ক করা ফোল্ডারে ফাইল সংরক্ষণের পরে ঠিক কী ঘটছে - আপনি *****
ফাইলের শেষে এমন কিছু দেখতে পাবেন । এটি আপনার কোডের সাথে মোটেই সম্পর্কিত নয়।
সমাধান।
যদি আপনি nginx
ভ্যাব্রেন্ট বাক্সে ব্যবহার করছেন - সার্ভার কনফিগারেশনে যুক্ত করুন:
sendfile off;
যদি আপনি apache
ভ্যাব্রেন্ট বাক্সে ব্যবহার করছেন - সার্ভার কনফিগারেশনে যুক্ত করুন:
EnableSendfile Off;
সমস্যার উত্স: ভার্চুয়ালবক্স বাগ
আপনি যদি অন্য কোন দস্তাবেজ (পিডিএফ এর মতো) কোডটি আপনার কনসোলটিতে অনুলিপি করে এবং এটি চালানোর চেষ্টা করছেন তবে এটিও ঘটতে পারে।
আমি যে জাভাস্ক্রিপ্ট বইটি পড়ছি তার মধ্যে থেকে কয়েকটি উদাহরণ কোড চালানোর চেষ্টা করছিলাম এবং অবাক হয়ে গিয়েছিলাম এটি কনসোলে চালিত হয়নি।
স্পষ্টতই, পিডিএফ থেকে অনুলিপি কিছু অপ্রত্যাশিত, অবৈধ এবং কোডে অদৃশ্য অক্ষরগুলির সাথে পরিচয় করিয়ে দেয়।
আমার ম্যাকের ক্ষেত্রেও আমার একই সমস্যা ছিল এবং এটি খুঁজে পেয়েছিলাম কারণ ম্যাকটি স্ট্যান্ডার্ড কোটগুলিকে কোঁকড়ানো উদ্ধৃতিগুলির সাথে প্রতিস্থাপন করছে যা অবৈধ জাভাস্ক্রিপ্টের অক্ষর।
এটি ঠিক করতে আমাকে আমার ম্যাক সিস্টেম পছন্দসমূহ => কীবোর্ড => পাঠ্য (ট্যাব) এর স্মার্ট উদ্ধৃতি এবং ড্যাশগুলি ব্যবহার করতে হবে (ডিফল্ট চেক করা হয়েছিল) এর সেটিংস পরিবর্তন করতে হয়েছিল।
ক্রোমে আমি এই ত্রুটিটি পেয়েছি যখন আমার ত্রুটিটি রেখার রেখার পরে একটি নির্ধারিত স্ট্রিং থাকে। স্ট্রিংটি বন্ধ করার পরে ত্রুটিটি চলে যায়।
ত্রুটির সাথে উদাহরণ:
var file = files[i]; // SyntaxError: Unexpected token ILLEGAL
jQuery('#someDiv').innerHTML = file.name + " (" + formatSize(file.size) + ") "
+ "<a href=\"javascript: something('"+file.id+');\">Error is here</a>";
ত্রুটিবিহীন উদাহরণ:
var file = files[i]; // No error
jQuery('#someDiv').innerHTML = file.name + " (" + formatSize(file.size) + ") "
+ "<a href=\"javascript: something('"+file.id+"');\">Error was here</a>";
আপনি যদি কোনও এনজিন্স + ইউউজি সেটআপ যোগ্রান্ট চালাচ্ছেন তবে মূল সমস্যাটি হ'ল ভার্চুয়াল বক্স বাগ সহ প্রেরণ ফাইলের উত্তর হিসাবে কিছু উল্লেখ করা হয়েছে। তবে এটি সমাধান করার জন্য আপনাকে এনজিঞ্জ এবং ইউউজি উভয় ক্ষেত্রেই সেন্ডফিল অক্ষম করতে হবে।
Nginx.conf এ সেন্ডফিল বন্ধ
uwsgi অ্যাপ্লিকেশন / কনফিগারেশন - অক্ষম-প্রেরণ ফাইল
ওএস এক্স চলাকালীন, ফাইল সিস্টেমটি আপনার সমস্ত ফাইলের মূলত লুকানো কাঁটা তৈরি করে, যদি তারা কোনও হার্ড ড্রাইভে থাকে যা এইচএফএস + সমর্থন করে না। এটি কখনও কখনও (আমার কাছে এখনই ঘটেছিল) আপনার জাভাস্ক্রিপ্ট ইঞ্জিনে নেতৃত্ব দিতে পারে যে কোডটি আপনি চালানোর ইচ্ছায় কোডটির পরিবর্তে ডেটা ফর্ক চালানোর চেষ্টা করে। যখন এটি ঘটবে, আপনিও পাবেন
SyntaxError: Unexpected token ILLEGAL
কারণ আপনার ফাইলের ডেটা ফর্কটিতে ইউনিকোড ইউ + 200 বি অক্ষর থাকবে। ডেটা ফর্ক ফাইলটি সরিয়ে ফেললে আপনার স্ক্রিপ্টটি আপনার কোডের বাইনারি ডেটা ফর্কটির পরিবর্তে আপনার আসল, অভিযুক্ত কোড চালাবে।
। যাই হোক না কেন: এই ফাইলগুলি এমন ভলিউমগুলিতে তৈরি করা হয়েছে যা সম্পূর্ণ এইচএফএস ফাইলের বৈশিষ্ট্যগুলিকে সমর্থন করে না (উদাঃ ইউএফএস ভলিউম, উইন্ডোজ ফাইলগুলি ইত্যাদি)। যখন কোনও ম্যাক ফাইলটি এই জাতীয় ভলিউমে অনুলিপি করা হয়, তখন এর ডেটা ফর্কটি ফাইলের নিয়মিত নামের অধীনে সংরক্ষণ করা হয় এবং অতিরিক্ত এইচএফএসের তথ্য (রিসোর্স ফর্ক, প্রকার ও স্রষ্টা কোড ইত্যাদি) একটি দ্বিতীয় ফাইলে (অ্যাপলডুবাল ফর্ম্যাটে) সংরক্ষণ করা হয়, " " দিয়ে শুরু হওয়া নামের সাথে with (এই ফাইলগুলি অবশ্যই ওএস-এক্স সম্পর্কিত যতদূর অদৃশ্য, তবে অন্য ওএসের নয়, এটি কখনও কখনও বিরক্তিকর হতে পারে ...)
আমার একই সমস্যা ছিল এবং এটি ঘটেছিল কারণ আমি একটি পাঠ্য স্ট্রিংয়ে কোড যুক্ত করার সময় এন্টার কীটি চাপলাম।
কারণ এটি পাঠ্যের দীর্ঘ স্ট্রিং ছিল আমি আমার পাঠ্য সম্পাদকটিতে স্ক্রোল না করেই এটি দেখতে চেয়েছিলাম, তবে এন্টার চাপলে স্ট্রিংটিতে একটি অদৃশ্য চরিত্র যুক্ত হয়েছিল যা অবৈধ was আমি আমার সম্পাদক হিসাবে সাবলাইম পাঠ্য ব্যবহার করছিলাম।
আমি গাদা আরও একটি উত্তর যুক্ত করতে যাচ্ছি। এই সমস্যাটি এনকোডিংয়ের কারণেও ঘটতে পারে। আপনি utf8 এনকোডিংটি নিরাপদ পাশে থাকতে চান want কিছু সম্পাদক ডিফল্টরূপে utf16 ব্যবহার করে যা সমস্যার কারণ হতে পারে। এটি পরীক্ষা করার একটি দ্রুত উপায়, উদাহরণস্বরূপ, ভিএস কোডে, কেবল একই বিষয়বস্তুটি পুনরায় তৈরি করুন তবে ফাইলটি তৈরি করতে vscode এর স্থানীয় সম্পাদক ব্যবহার করুন। আশা করি এটি কিছুটা সাহায্য করবে।