मुझे अपने कंसोल पर यह जावास्क्रिप्ट त्रुटि मिल रही है:
बिना पढ़ा हुआ वाक्यविन्यास: अप्रत्याशित टोकन ILLEGAL
यह मेरा कोड है:
var foo = 'bar';
यह सुपर सरल है, जैसा कि आप देख सकते हैं। यह एक वाक्यविन्यास त्रुटि का कारण कैसे हो सकता है?
मुझे अपने कंसोल पर यह जावास्क्रिप्ट त्रुटि मिल रही है:
बिना पढ़ा हुआ वाक्यविन्यास: अप्रत्याशित टोकन ILLEGAL
यह मेरा कोड है:
var foo = 'bar';
यह सुपर सरल है, जैसा कि आप देख सकते हैं। यह एक वाक्यविन्यास त्रुटि का कारण कैसे हो सकता है?
जवाबों:
जब कोड जावास्क्रिप्ट दुभाषिया द्वारा पार्स किया जाता है, तो यह "टोकन" नामक टुकड़ों में टूट जाता है। जब एक टोकन को चार बुनियादी टोकन प्रकारों में से एक में वर्गीकृत नहीं किया जा सकता है , तो इसे अधिकांश कार्यान्वयन पर "ILLEGAL" लेबल मिलता है, और यह त्रुटि फेंक दी जाती है।
उसी त्रुटि को उठाया जाता है यदि, उदाहरण के लिए, आप एक दुष्ट @
चरित्र के साथ एक जेएस फ़ाइल चलाने की कोशिश करते हैं , एक गलत कर्ली ब्रेस, ब्रैकेट, "स्मार्ट कोट्स", एकल उद्धरण ठीक से संलग्न नहीं (जैसे this.run('dev1)
) और इसी तरह।
बहुत सी विभिन्न परिस्थितियाँ इस त्रुटि का कारण बन सकती हैं। लेकिन अगर आपके पास कोई स्पष्ट वाक्यविन्यास त्रुटि या अवैध चरित्र नहीं है, तो यह एक अदृश्य अवैध चरित्र के कारण हो सकता है । यही इसका उत्तर है।
कोड में एक अदृश्य चरित्र है, जो अर्धविराम के ठीक बाद है। यह यूनिकोड U+200B
शून्य-चौड़ाई वाला अंतरिक्ष वर्ण (उर्फ ZWSP
, HTML इकाई ​
) है। उस चरित्र को Unexpected token ILLEGAL
जावास्क्रिप्ट सिंटैक्स त्रुटि के कारण जाना जाता है ।
मैं निश्चित रूप से नहीं बता सकता, लेकिन मेरी शर्त jsfiddle पर है । यदि आप वहां से कोड पेस्ट करते हैं, तो एक या एक से अधिक U+200B
वर्णों को शामिल करना संभव है । ऐसा लगता है कि उपकरण उस चरित्र का उपयोग शब्द-आवरण को लंबे तारों पर नियंत्रित करने के लिए करता है।
अद्यतन 2013-01-07
नवीनतम jsfiddle अद्यतन के बाद , अब यह कोडपीन की तरह एक लाल बिंदु के रूप में चरित्र दिखा रहा है। जाहिरा तौर पर , यह
U+200B
अब अपने दम पर पात्रों को सम्मिलित नहीं कर रहा है, इसलिए यह समस्या अभी से कम होनी चाहिए।अद्यतन 2015-03-17
आवारा कभी कभी में एक बग के कारण है, साथ ही इस मुद्दे को पैदा करने के लिए प्रकट होता है VirtualBox । इस ब्लॉग पोस्ट के अनुसार समाधान,
sendfile off;
आपके nginx config में सेट करना है, याEnableSendfile Off
यदि आप Apache का उपयोग करते हैं।
यह भी बताया गया है कि Chrome डेवलपर टूल से चिपकाए गए कोड में वह वर्ण शामिल हो सकता है, लेकिन मैं वर्तमान संस्करण (OSX पर 22.0.1229.79) के साथ पुन: पेश करने में असमर्थ था।
चरित्र अदृश्य है, हम जानते हैं कि यह कैसे है? आप अपने संपादक से अदृश्य अक्षर दिखाने के लिए कह सकते हैं। अधिकांश पाठ संपादकों में यह सुविधा है। उदाहरण के लिए, विम उन्हें डिफ़ॉल्ट रूप से प्रदर्शित करता है, और जैसा ZWSP
दिखाता है <u200b>
। आप इसे ऑनलाइन भी डिबग कर सकते हैं: jsbin अपने कोड पैन पर चरित्र को लाल बिंदु के रूप में प्रदर्शित करता है (लेकिन पेज को सहेजने और पुनः लोड करने के बाद इसे हटाता है)। CodePen.io इसे एक डॉट के रूप में भी प्रदर्शित करता है , और सहेजने के बाद भी इसे रखता है।
वह चरित्र कुछ बुरा नहीं है, यह वास्तव में काफी उपयोगी हो सकता है। विकिपीडिया पर यह उदाहरण दर्शाता है कि यह कैसे नियंत्रित किया जा सकता है जहां एक लंबी स्ट्रिंग को अगली पंक्ति में लपेटा जाना चाहिए। हालांकि, यदि आप अपने मार्कअप पर चरित्र की उपस्थिति से अनजान हैं, तो यह एक समस्या बन सकती है। यदि आपके पास यह एक स्ट्रिंग के अंदर है (उदाहरण के लिए, nodeValue
एक DOM तत्व की जिसमें कोई दृश्य सामग्री नहीं है), तो आप ऐसे स्ट्रिंग को खाली होने की उम्मीद कर सकते हैं, जब वास्तव में यह (लागू करने के बाद भी String.trim
) नहीं है।
ZWSP
HTML पृष्ठ पर अतिरिक्त व्हाट्सएप भी प्रदर्शित किया जा सकता है, उदाहरण के लिए जब यह दो <div>
तत्वों के बीच पाया जाता है (जैसा कि इस प्रश्न पर देखा गया है )। यह मामला jsfiddle पर प्रतिलिपि प्रस्तुत करने योग्य भी नहीं है, क्योंकि चरित्र को वहां अनदेखा किया गया है।
एक अन्य संभावित समस्या: यदि वेब पेज की एन्कोडिंग को यूटीएफ -8 के रूप में मान्यता प्राप्त नहीं है, तो चरित्र वास्तव में प्रदर्शित हो सकता है ( ​
उदाहरण के लिए, लैटिन 1 में)।
यदि ZWSP
सीएसएस कोड (इनलाइन कोड, या एक बाहरी स्टाइलशीट) पर मौजूद है, तो शैलियों को भी ठीक से पार्स नहीं किया जा सकता है, इसलिए कुछ शैलियों को लागू नहीं किया जाता है (जैसा कि इस प्रश्न पर देखा गया है )।
मुझे ECMAScript स्पेसिफिकेशन (संस्करण 3 और 5.1 ) पर उस विशिष्ट चरित्र का कोई उल्लेख नहीं मिला । वर्तमान संस्करण में धारा 7.1 पर समान वर्णों ( U+200C
और U+200D
) का उल्लेख है , जो कहता है कि उन्हें "टिप्पणियों के बाहर, स्ट्रिंग शाब्दिक और नियमित अभिव्यक्ति शाब्दिक" के रूप में माना जाना चाहिए । वे वर्ण, उदाहरण के लिए, एक चर नाम का हिस्सा हो सकते हैं (और वास्तव में काम करता है)।IdentifierPart
var x\u200c;
धारा 7.2 वैध व्हाइट स्पेस वर्णों (जैसे टैब, स्पेस, नो-ब्रेक स्पेस आदि) को सूचीबद्ध करता है, और अस्पष्ट उल्लेख करता है कि किसी भी अन्य यूनिकोड "स्पेस सेपरेटर" (श्रेणी "जेड") को सफेद स्थान के रूप में माना जाना चाहिए। मैं शायद इस संबंध में चश्मे पर चर्चा करने के लिए सबसे अच्छा व्यक्ति नहीं हूं, लेकिन यह मुझे लगता है कि उस के U+200B
अनुसार सफेद स्थान माना जाना चाहिए, जब वास्तव में कार्यान्वयन (कम से कम क्रोम और फ़ायरफ़ॉक्स) उन्हें एक अप्रत्याशित के रूप में मानते हैं वाक्यविन्यास त्रुटि के कारण टोकन (या एक हिस्सा)।
function
कीवर्ड के सिंटैक्स हाइलाइटिंग पर चुटकी ली , जो विम में अदृश्य था जब तक कि मैंने "सभी गैर-मुद्रण योग्य वर्णों को हाइलाइट न करें" FAQ विधि का उपयोग करके इसे हाइलाइट किया। आह यह बहुत अच्छा होगा अगर वहाँ एक तरह से केवल 32..127 की रेंज में वर्ण कॉपी करने के लिए किया गया था (लेकिन वहाँ शायद उस :) के लिए एक ऐप है)
आप इस समस्या को अपने कोड में क्यों ढूंढ रहे हैं? यहां तक कि, अगर यह नकल है।
यदि आप देख सकते हैं, तो सिंक किए गए फ़ोल्डर में फ़ाइल को सहेजने के बाद क्या हो रहा है - आपको *****
फ़ाइल के अंत में कुछ दिखाई देगा । यह आपके कोड से संबंधित नहीं है।
उपाय।
यदि आप nginx
आवारा बॉक्स का उपयोग कर रहे हैं - सर्वर कॉन्फ़िगरेशन में जोड़ें:
sendfile off;
यदि आप apache
आवारा बॉक्स का उपयोग कर रहे हैं - सर्वर कॉन्फ़िगरेशन में जोड़ें:
EnableSendfile Off;
समस्या का स्रोत: VirtualBox बग
यह तब भी हो सकता है जब आप किसी अन्य दस्तावेज़ (जैसे PDF) से कोड को अपने कंसोल में कॉपी कर रहे हों और उसे चलाने का प्रयास कर रहे हों।
मैं एक जावास्क्रिप्ट कोड से कुछ उदाहरण कोड चलाने की कोशिश कर रहा था जो मैं पढ़ रहा था और आश्चर्यचकित था कि यह कंसोल में नहीं चला।
जाहिरा तौर पर, पीडीएफ से कॉपी करने पर कोड में कुछ अप्रत्याशित, अवैध और अदृश्य वर्णों का परिचय होता है।
मुझे अपने मैक पर समान समस्या थी और यह पाया गया क्योंकि मैक मानक उद्धरणों को घुंघराले उद्धरणों के साथ बदल रहा था जो कि अवैध जावास्क्रिप्ट वर्ण हैं।
इसे ठीक करने के लिए मुझे अपने मैक सिस्टम प्रेफरेंस => कीबोर्ड => टेक्स्ट (टैब) को स्मार्ट कोट्स और डैश (अनचेक को चेक किया गया) का उपयोग अनचेक करना था।
मुझे यह त्रुटि क्रोम में तब मिली जब मेरे पास त्रुटि के लिए इंगित की गई लाइन के बाद एक असंबद्ध स्ट्रिंग थी। स्ट्रिंग को बंद करने के बाद त्रुटि चली गई।
त्रुटि के साथ उदाहरण:
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>";
ओएस एक्स को चलाते समय, फाइलसिस्टम मूल रूप से आपकी सभी फाइलों के छिपे हुए कांटे बनाता है, यदि वे हार्ड ड्राइव पर हैं जो एचएफएस + का समर्थन नहीं करते हैं। यह कभी-कभी हो सकता है (अभी-अभी मेरे साथ हुआ है) आपके जावास्क्रिप्ट इंजन के लिए सीसा के बजाय डेटा-कांटा चलाने की कोशिश करता है जिसे आप इसे चलाने का इरादा रखते हैं। जब ऐसा होता है, तो आप भी प्राप्त करेंगे
SyntaxError: Unexpected token ILLEGAL
क्योंकि आपकी फ़ाइल के डेटा कांटे में यूनिकोड U + 200B वर्ण होगा। डेटा कांटा फ़ाइल को हटाने से आपकी स्क्रिप्ट आपके कोड के एक बाइनरी डेटा कांटा के बजाय आपके वास्तविक, इच्छित कोड को चलाएगी।
। जो कुछ भी: ये फाइलें उन संस्करणों पर बनाई जाती हैं जो मूल रूप से पूर्ण HFS फ़ाइल विशेषताओं (जैसे ufs संस्करणों, विंडोज fileshares, आदि) का समर्थन नहीं करती हैं। जब मैक फ़ाइल को इस तरह की मात्रा में कॉपी किया जाता है, तो उसका डेटा कांटा फ़ाइल के नियमित नाम के तहत संग्रहीत होता है, और अतिरिक्त HFS जानकारी (संसाधन कांटा, प्रकार और निर्माता कोड, आदि) एक दूसरी फ़ाइल (AppleDouble प्रारूप में) में संग्रहीत होती है, एक नाम के साथ जो " "। (ये फाइलें, निश्चित रूप से, जहां तक OS-X का संबंध है, अदृश्य है, लेकिन अन्य OS के लिए नहीं; यह कभी-कभी कष्टप्रद हो सकता है ...)
मुझे भी यही समस्या थी और ऐसा इसलिए हुआ क्योंकि मैंने टेक्स्ट स्ट्रिंग में कोड जोड़ते समय एंटर की को हिट किया था।
क्योंकि यह पाठ का एक लंबा तार था जिसे मैं अपने पाठ संपादक में स्क्रॉल किए बिना यह सब देखना चाहता था, हालांकि प्रवेश करने से स्ट्रिंग में एक अदृश्य चरित्र जुड़ गया जो कि अवैध था। मैं अपने संपादक के रूप में उदात्त पाठ का उपयोग कर रहा था।
मैं ढेर में एक और उत्तर जोड़ने जा रहा हूं। एन्कोडिंग के कारण भी यह समस्या हो सकती है। आप चाहते हैं कि utf8 एन्कोडिंग सुरक्षित पक्ष पर हो। डिफ़ॉल्ट रूप से कुछ संपादक utf16 का उपयोग करते हैं जो समस्या का कारण बन सकता है। इसका परीक्षण करने का एक त्वरित तरीका, वीएस कोड में उदाहरण के लिए, बस उसी सामग्री को फिर से बनाना है लेकिन फ़ाइल बनाने के लिए vscode के स्थानीय संपादक का उपयोग करें। आशा है कि यह कुछ मदद करता है।