"अप्रत्याशित टोकन ILLEGAL" के लिए कोई दृश्य कारण नहीं


270

मुझे अपने कंसोल पर यह जावास्क्रिप्ट त्रुटि मिल रही है:

बिना पढ़ा हुआ वाक्यविन्यास: अप्रत्याशित टोकन ILLEGAL

यह मेरा कोड है:

var foo = 'bar';​

यह सुपर सरल है, जैसा कि आप देख सकते हैं। यह एक वाक्यविन्यास त्रुटि का कारण कैसे हो सकता है?


9
भविष्य के पाठकों के लिए: अगर आपको
वैग्रंट

इस घटना में कि आप इसे वर्डप्रेस में अनुभव कर रहे हैं, फ़ंक्शंस.php से स्क्रिप्ट को एंक्यू करें। मेरे पास एक विशिष्ट टेम्पलेट था जहां मैं जेएस के लिए सीधे टेम्पलेट से कॉल कर रहा था। Wp_head या wp_footer में सशर्त एन्क्यू पर स्विच करने से यह हल हो गया।
अल्पेश शाह

7
मॉडरेटर का नोट: मैंने यहां उत्तरों का एक गुच्छा हटा दिया है जो वास्तव में प्रश्न का उत्तर नहीं देते हैं। यह नहीं है, मैं नहीं दोहराता , जावास्क्रिप्ट में आप कर सकते हैं हर संभव चीज़ को सूचीबद्ध करने के लिए एक जगह है जिसके परिणामस्वरूप यह त्रुटि होगी। प्रश्न में एक बहुत विशिष्ट परिस्थिति होती है, जिसमें कोई भी परिदृश्य शामिल नहीं होता है, और उन सभी उदाहरणों में प्रश्न का उत्तर नहीं दिया जाता है।
animuson

3
वाह, एसओ पुलिस के पास इस सवाल का एक दिन था। सौभाग्य से, कुछ प्रासंगिक जानकारी अभी भी हटाए गए उत्तरों में दिखाई दे रही है।
cdonner

जवाबों:


493

त्रुटि

जब कोड जावास्क्रिप्ट दुभाषिया द्वारा पार्स किया जाता है, तो यह "टोकन" नामक टुकड़ों में टूट जाता है। जब एक टोकन को चार बुनियादी टोकन प्रकारों में से एक में वर्गीकृत नहीं किया जा सकता है , तो इसे अधिकांश कार्यान्वयन पर "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) नहीं है।

ZWSPHTML पृष्ठ पर अतिरिक्त व्हाट्सएप भी प्रदर्शित किया जा सकता है, उदाहरण के लिए जब यह दो <div>तत्वों के बीच पाया जाता है (जैसा कि इस प्रश्न पर देखा गया है )। यह मामला jsfiddle पर प्रतिलिपि प्रस्तुत करने योग्य भी नहीं है, क्योंकि चरित्र को वहां अनदेखा किया गया है।

एक अन्य संभावित समस्या: यदि वेब पेज की एन्कोडिंग को यूटीएफ -8 के रूप में मान्यता प्राप्त नहीं है, तो चरित्र वास्तव में प्रदर्शित हो सकता है ( ​उदाहरण के लिए, लैटिन 1 में)।

यदि ZWSPसीएसएस कोड (इनलाइन कोड, या एक बाहरी स्टाइलशीट) पर मौजूद है, तो शैलियों को भी ठीक से पार्स नहीं किया जा सकता है, इसलिए कुछ शैलियों को लागू नहीं किया जाता है (जैसा कि इस प्रश्न पर देखा गया है )।

ECMAScript विशिष्टता

मुझे ECMAScript स्पेसिफिकेशन (संस्करण 3 और 5.1 ) पर उस विशिष्ट चरित्र का कोई उल्लेख नहीं मिला । वर्तमान संस्करण में धारा 7.1 पर समान वर्णों ( U+200Cऔर U+200D) का उल्लेख है , जो कहता है कि उन्हें "टिप्पणियों के बाहर, स्ट्रिंग शाब्दिक और नियमित अभिव्यक्ति शाब्दिक" के रूप में माना जाना चाहिए । वे वर्ण, उदाहरण के लिए, एक चर नाम का हिस्सा हो सकते हैं (और वास्तव में काम करता है)।IdentifierPartvar x\u200c;

धारा 7.2 वैध व्हाइट स्पेस वर्णों (जैसे टैब, स्पेस, नो-ब्रेक स्पेस आदि) को सूचीबद्ध करता है, और अस्पष्ट उल्लेख करता है कि किसी भी अन्य यूनिकोड "स्पेस सेपरेटर" (श्रेणी "जेड") को सफेद स्थान के रूप में माना जाना चाहिए। मैं शायद इस संबंध में चश्मे पर चर्चा करने के लिए सबसे अच्छा व्यक्ति नहीं हूं, लेकिन यह मुझे लगता है कि उस के U+200Bअनुसार सफेद स्थान माना जाना चाहिए, जब वास्तव में कार्यान्वयन (कम से कम क्रोम और फ़ायरफ़ॉक्स) उन्हें एक अप्रत्याशित के रूप में मानते हैं वाक्यविन्यास त्रुटि के कारण टोकन (या एक हिस्सा)।


codepen.io भी इस चरित्र को प्रदर्शित करता है। VIM और VI, नोटपैड ++ भी प्रदर्शित करता है।
रिलेमन

थैंक्स @rlemon ने उत्तर में एक CodePen उदाहरण जोड़ा। अच्छी साइट, मैं इसके बारे में नहीं जानता था।
bfavaretto

क्रोमियम का उपयोग करके इस SO प्रश्न से testTwo वर्ग के लिए कोड को कॉपी / पेस्ट करते समय इस समस्या में भाग गया । जाहिरा तौर पर, पार्सर ने functionकीवर्ड के सिंटैक्स हाइलाइटिंग पर चुटकी ली , जो विम में अदृश्य था जब तक कि मैंने "सभी गैर-मुद्रण योग्य वर्णों को हाइलाइट न करें" FAQ विधि का उपयोग करके इसे हाइलाइट किया। आह यह बहुत अच्छा होगा अगर वहाँ एक तरह से केवल 32..127 की रेंज में वर्ण कॉपी करने के लिए किया गया था (लेकिन वहाँ शायद उस :) के लिए एक ऐप है)
पावती

1
@bfavaretto, केवल कोड स्निपेट में संपादन मोड में। प्रश्न के शरीर में नहीं, इसका उल्लेख करना चाहिए था। (क्रोम 43.0.2357.124 मीटर पर परीक्षण किया गया)
फर्नांडो लील

1
कई पाठ संपादक एक फ़ाइल के चरित्र एन्कोडिंग को बदलने की अनुमति देते हैं। इस तरह के आक्रामक चरित्रों को खोजने के लिए यह काफी उपयोगी है। मेरा समाधान अस्थायी रूप से UTF-8 से एक ANSI एन्कोडिंग पर स्विच करने के लिए था, अमान्य वर्णों को हटा दें, फिर वापस स्विच करें। मैंने विंडोज पर फ्रीवेयर नोटपैड ++ का इस्तेमाल किया। संपादित करें: "सभी वर्णों को प्रदर्शित करने" के लिए मैंने नोटपैड ++ विकल्प को याद किया। समान परिणाम, कम परेशानी:
14

64

आप इस समस्या को अपने कोड में क्यों ढूंढ रहे हैं? यहां तक ​​कि, अगर यह नकल है।

यदि आप देख सकते हैं, तो सिंक किए गए फ़ोल्डर में फ़ाइल को सहेजने के बाद क्या हो रहा है - आपको *****फ़ाइल के अंत में कुछ दिखाई देगा । यह आपके कोड से संबंधित नहीं है।

उपाय।

यदि आप nginxआवारा बॉक्स का उपयोग कर रहे हैं - सर्वर कॉन्फ़िगरेशन में जोड़ें:

sendfile off;

यदि आप apacheआवारा बॉक्स का उपयोग कर रहे हैं - सर्वर कॉन्फ़िगरेशन में जोड़ें:

EnableSendfile Off;

समस्या का स्रोत: VirtualBox बग


6
आपने सचमुच मेरा दिन बचा लिया। मैंने एक पूरी शाम के लिए Nginx + Vagrant से संघर्ष किया है, और इसने इसे हल किया।
बजे

2
था नहीं उम्मीद यह (मेरे लिए), लेकिन यह था बहुत बहुत धन्यवाद सही जवाब हो सकता है,।
शार्लोट

2
दरअसल, इसने काम करना बंद कर दिया। तो फिर से यहाँ खेलने के लिए सहानुभूति की कई परतें हैं इसलिए मैं सिर्फ वही कर रहा हूँ जो मैं कर सकता था।
शार्लेट

धन्यवाद - मैं नग्नेक्स के साथ एक योनि बॉक्स में था। मैंने इस मुद्दे को इसी तरह के अपाचे सेटअप पर भी देखा है।
कैमरून

अपाचे के लिए: EnableSendfile Off
jamlee

7

यह तब भी हो सकता है जब आप किसी अन्य दस्तावेज़ (जैसे PDF) से कोड को अपने कंसोल में कॉपी कर रहे हों और उसे चलाने का प्रयास कर रहे हों।

मैं एक जावास्क्रिप्ट कोड से कुछ उदाहरण कोड चलाने की कोशिश कर रहा था जो मैं पढ़ रहा था और आश्चर्यचकित था कि यह कंसोल में नहीं चला।

जाहिरा तौर पर, पीडीएफ से कॉपी करने पर कोड में कुछ अप्रत्याशित, अवैध और अदृश्य वर्णों का परिचय होता है।


5

मुझे अपने मैक पर समान समस्या थी और यह पाया गया क्योंकि मैक मानक उद्धरणों को घुंघराले उद्धरणों के साथ बदल रहा था जो कि अवैध जावास्क्रिप्ट वर्ण हैं।

इसे ठीक करने के लिए मुझे अपने मैक सिस्टम प्रेफरेंस => कीबोर्ड => टेक्स्ट (टैब) को स्मार्ट कोट्स और डैश (अनचेक को चेक किया गया) का उपयोग अनचेक करना था।


5

मुझे यह त्रुटि क्रोम में तब मिली जब मेरे पास त्रुटि के लिए इंगित की गई लाइन के बाद एक असंबद्ध स्ट्रिंग थी। स्ट्रिंग को बंद करने के बाद त्रुटि चली गई।

त्रुटि के साथ उदाहरण:

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

2
मुझे अंतर का पता लगाने के लिए आपके दो उदाहरणों पर एक अंतर चलाना था, और एक बार जब मैंने किया तो मुझे तुरंत अपनी समस्या का पता चल गया।
बेन हेरोल्ड

3

यदि आप एक nginx + uwsgi सेटअप योनि चला रहे हैं तो मुख्य समस्या कुछ जवाबों में उल्लिखित फ़ाइल के साथ वर्चुअल बॉक्स बग है। हालाँकि इसे हल करने के लिए आपको नंगेक्स और uwsgi दोनों में सेंडफाइल को निष्क्रिय करना होगा।

  1. Nginx.conf में बंद भेज दें

  2. uwsgi आवेदन / config --disable-sendfile


2

ओएस एक्स को चलाते समय, फाइलसिस्टम मूल रूप से आपकी सभी फाइलों के छिपे हुए कांटे बनाता है, यदि वे हार्ड ड्राइव पर हैं जो एचएफएस + का समर्थन नहीं करते हैं। यह कभी-कभी हो सकता है (अभी-अभी मेरे साथ हुआ है) आपके जावास्क्रिप्ट इंजन के लिए सीसा के बजाय डेटा-कांटा चलाने की कोशिश करता है जिसे आप इसे चलाने का इरादा रखते हैं। जब ऐसा होता है, तो आप भी प्राप्त करेंगे

SyntaxError: Unexpected token ILLEGAL

क्योंकि आपकी फ़ाइल के डेटा कांटे में यूनिकोड U + 200B वर्ण होगा। डेटा कांटा फ़ाइल को हटाने से आपकी स्क्रिप्ट आपके कोड के एक बाइनरी डेटा कांटा के बजाय आपके वास्तविक, इच्छित कोड को चलाएगी।

जो कुछ भी: ये फाइलें उन संस्करणों पर बनाई जाती हैं जो मूल रूप से पूर्ण HFS फ़ाइल विशेषताओं (जैसे ufs संस्करणों, विंडोज fileshares, आदि) का समर्थन नहीं करती हैं। जब मैक फ़ाइल को इस तरह की मात्रा में कॉपी किया जाता है, तो उसका डेटा कांटा फ़ाइल के नियमित नाम के तहत संग्रहीत होता है, और अतिरिक्त HFS जानकारी (संसाधन कांटा, प्रकार और निर्माता कोड, आदि) एक दूसरी फ़ाइल (AppleDouble प्रारूप में) में संग्रहीत होती है, एक नाम के साथ जो " "। (ये फाइलें, निश्चित रूप से, जहां तक ​​OS-X का संबंध है, अदृश्य है, लेकिन अन्य OS के लिए नहीं; यह कभी-कभी कष्टप्रद हो सकता है ...)


1

यहाँ मेरा कारण है:

इससे पहले:

var path = "D:\xxx\util.s"

जो \uबच रहा है, मैंने उसे कोडपेन के विश्लेषण जेएस का उपयोग करके समझ लिया ।

उपरांत:

var path = "D:\\xxx\\util.s"

और त्रुटि ठीक हो गई


0

मुझे भी यही समस्या थी और ऐसा इसलिए हुआ क्योंकि मैंने टेक्स्ट स्ट्रिंग में कोड जोड़ते समय एंटर की को हिट किया था।

क्योंकि यह पाठ का एक लंबा तार था जिसे मैं अपने पाठ संपादक में स्क्रॉल किए बिना यह सब देखना चाहता था, हालांकि प्रवेश करने से स्ट्रिंग में एक अदृश्य चरित्र जुड़ गया जो कि अवैध था। मैं अपने संपादक के रूप में उदात्त पाठ का उपयोग कर रहा था।


0

मैंने सभी अंतरिक्ष क्षेत्रों को & nbsp में बदल दिया, ठीक उसी तरह और इसने बिना किसी समस्या के काम किया।

val.replace ("", "& nbsp");

मुझे उम्मीद है कि यह किसी की मदद करता है।


0

मैं ढेर में एक और उत्तर जोड़ने जा रहा हूं। एन्कोडिंग के कारण भी यह समस्या हो सकती है। आप चाहते हैं कि utf8 एन्कोडिंग सुरक्षित पक्ष पर हो। डिफ़ॉल्ट रूप से कुछ संपादक utf16 का उपयोग करते हैं जो समस्या का कारण बन सकता है। इसका परीक्षण करने का एक त्वरित तरीका, वीएस कोड में उदाहरण के लिए, बस उसी सामग्री को फिर से बनाना है लेकिन फ़ाइल बनाने के लिए vscode के स्थानीय संपादक का उपयोग करें। आशा है कि यह कुछ मदद करता है।

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