दिलचस्प पोस्ट
PHP के साथ जीसीएम (Google क्लाउड मेसेजिंग) Memcpy पर अनिर्दिष्ट लॉन्च विफलता सी के लिए XML पार्सर आईफ़ोन पर वाईफ़ाई गेटवे पता कैसे प्राप्त करें? आप एंड्रॉइड उपयोगकर्ता के ईमेल पते को कैसे प्राप्त कर सकते हैं? किसी अन्य प्रोजेक्ट में स्प्रिंग बूट जार के लिए निर्भरता कैसे जोड़ें? एएसपी.नेट पथ में टिल्ड (~) का उपयोग कैसे जांचें कि कोई प्रोसेस आईडी (पीआईडी) मौजूद है या नहीं सीएएमएल मोड के बाहर इस्तेमाल किए गए लूप की प्रारंभिक घोषणा के लिए मैं "जीसीसी त्रुटि" कैसे ठीक कर सकता हूं? एक log4j कंसोल एपेन्डर बनाने के लिए विभिन्न धागे के लिए अलग-अलग रंग का उपयोग करें "शब्द-ब्रेक: ब्रेक-ऑल" बनाम "वर्ड-रैप: ब्रेक-वर्ड" सीएसएस में क्या अंतर है? WebBrowser नियंत्रण में प्रदान की जाने वाली HTML (जावास्क्रिप्ट द्वारा संसाधित) कैसे प्राप्त करें? एकल WPF TextBlock में एकाधिक मानों को बाँध कैसे करें? समय में स्थैतिक फ़ील्ड्स आरम्भ नहीं किए जाते हैं? क्या जावा में एक एनोटेशन के मूल्य को पढ़ना संभव है?

जावास्क्रिप्ट के eval को JSON डेटा eval करने के लिए कोष्ठक की आवश्यकता क्यों है?

मैंने सीखा है (कठिन रास्ता) मुझे जेसनसन डेटा के आसपास कोष्ठकों को जोड़ने की आवश्यकता है, जैसे:

stuff = eval('(' + data_from_the_wire + ')'); // where data_from_the_wire was, for example {"text": "hello"} 

(फ़ायरफ़ॉक्स 3 में, कम से कम)।

इसके पीछे क्या कारण है? मैं हुड के पीछे क्या है यह समझने के बिना कोड लिखना नफरत करता हूँ

वेब के समाधान से एकत्रित समाधान "जावास्क्रिप्ट के eval को JSON डेटा eval करने के लिए कोष्ठक की आवश्यकता क्यों है?"

data_from_the_wire चारों ओर कोष्ठकों को लाना प्रभावी रूप से बराबर है

 stuff = eval('return ' + data_from_the_wire + ';'); 

यदि आप कोष्ठकों के बिना eval किया गया था, तो कोड का मूल्यांकन किया जाएगा, और यदि आपके पास इसके अंदर कोई नामित फ़ंक्शन था, तो उनको परिभाषित किया जाएगा, लेकिन लौटा नहीं।

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

 (function() { alert('whoot'); })() 

उस फ़ंक्शन को कॉल करेगा जिसे अभी परिभाषित किया गया है। निम्नलिखित, हालांकि, काम नहीं करता है:

 function() { alert('whoot'); }() 

इसलिए हम देखते हैं कि कोष्ठक प्रभावी ढंग से फिर से एक अभिव्यक्ति में कोड को बदलते हैं, बजाए बस चलाने के लिए कोड।

eval जावास्क्रिप्ट बयान के एक अनुक्रम को स्वीकार करता है जावास्क्रिप्ट पार्सर '{' टोकन की व्याख्या करता है, एक बयान की शुरुआत के रूप में एक बयान के भीतर आ रहा है और किसी आशय की शुरुआत नहीं करता है

जब आप इस तरह के कोष्ठक में अपना शाब्दिक लगाते हैं: ({ data_from_the_wire }) आप जावास्क्रिप्ट पार्सर को अभिव्यक्ति पार्सिंग मोड में बदल रहे हैं। एक अभिव्यक्ति के अंदर टोकन '{' का मतलब है किसी वस्तु को शाब्दिक घोषणा की शुरुआत और ब्लॉक नहीं है, और इस प्रकार जावास्क्रिप्ट एक वस्तु के रूप में इसे स्वीकार करता है।

मुझे इस कारण के बारे में निश्चित नहीं है, लेकिन मैं json.org से JSON वर्ग का उपयोग करके JSON को पार्स करता हूं । यह eval का उपयोग करने से ज्यादा सुरक्षित है

JavaScript में, कर्ली ब्रैकेट का उपयोग ब्लॉक स्टेटमेंट बनाने के लिए किया जाता है:

 { var foo = "bar"; var blah = "baz"; doSomething(); } 

उपरोक्त पंक्तियों को एक स्ट्रिंग के अंदर रखा जा सकता है और समस्या के बिना उदारीकरण किया जा सकता है। अब इस पर विचार करें:

 { "foo": "bar", "blah": "baz" } 

घुंघराले ब्रैकेट जावास्क्रिप्ट इंजन को लगता है कि यह एक समूह अभिव्यक्ति है, इसलिए चारों ओर वाक्यविन्यास त्रुटि : चरित्र एमडीएन से उद्धरण … जावास्क्रिप्ट गाइड … ऑब्जेक्ट लाइटरः

एक बयान की शुरुआत में आपको किसी ऑब्जेक्ट का इस्तेमाल नहीं करना चाहिए। यह आपको त्रुटि की ओर ले जाएगा या आपकी अपेक्षा के अनुसार व्यवहार नहीं करेगा, क्योंकि {किसी ब्लॉक की शुरुआत के रूप में व्याख्या की जाएगी।

ऑब्जेक्ट को आंशिक रूप से लपेटने का कार्य इंजन () को एक कथन के रूप में नहीं, ब्लॉक स्टेटमेंट के रूप में अभिव्यक्ति के रूप में व्यवहार करने के लिए कहकर काम करता है तो यह काम नहीं करता है:

 ({ var foo = "bar"; var blah = "baz"; doSomething(evil); }) // parse error 

लेकिन यह है:

 ({ "foo": "bar", "blah": "baz" }) // returns object 

ऐसा इसलिए होता है क्योंकि गोल ब्रेस बिना जावास्क्रिप्ट {"text": ... एक लेबल के रूप में और असफल होने की कोशिश करता है इसे कंसोल में आज़माएं और आपको "अवैध लेबल" त्रुटि मिलेगी

यह data_from_the_wire के मूल्य पर निर्भर करता है, वास्तव में ज्यादातर मामलों में आपका वाक्यविन्यास ठीक है, लेकिन एक पंक्ति जो { से शुरू होती है { को लेबल के रूप में पार्स किया जाता है, और आपका अमान्य है यदि आप इसे कोष्ठक के साथ घेरते हैं, तो यह आपकी अभिव्यक्ति को गलत तरीके से व्याख्या करने से पार्सर को रोकता है।

बस एक पार्सिंग समस्या है, वास्तव में तारों, संख्याओं या कार्यों के साथ, आपको यह समस्या नहीं होती।

एक समाधान हमेशा निर्देशों को निरस्त करने और अभिव्यक्तियों के लिए नहीं है। तुम लिख सकते हो

 eval('var stuff = {"text": "hello"}'); 

मुझे नहीं पता है, और मैं वास्तव में इसका जवाब में दिलचस्पी लेता हूं, लेकिन मेरा अनुमान है कि डेटा के बिना data_from_the_wire के डेटा को समापन के रूप में data_from_the_wire जाएगा। संभवतः कोष्ठक बल मूल्यांकन और इसलिए साहचर्य सरणी 'वापस' है

यह अनुमान लगाने का प्रकार है, हालांकि डाउनवॉल्स की ओर जाता है =)।

संपादित करें

डगलस क्रॉकफोर्ड ने अपनी JSON साइट पर एक सिंटेक्स अस्पष्टता का उल्लेख किया है, लेकिन इससे वास्तव में मेरी मदद नहीं हुई