दिलचस्प पोस्ट
जावास्क्रिप्ट getCookie फ़ंक्शन कैसे निजी डेटा से डेटा डेटा सेट बनाने के लिए (uninformative जगह धारकों के साथ चर नाम और स्तर की जगह)? पृष्ठभूमि में एक कीबोर्ड कुंजीपैथी को कैप्चर करें मैं उस स्क्रिप्ट के भीतर से स्क्रिप्ट फ़ाइल नाम कैसे प्राप्त करूं? Cv :: warp निष्पादित सीवी :: प्वाइंट के एक सेट पर एक फर्जी डेस्किंग के लिए मैं हास्केल में पठनीय / लिखने योग्य बनने के लिए एकाधिक फ़ाइलों / सॉकेट कैसे देख सकता हूं? सी में संघ के बारे में एक सवाल निर्दिष्ट मान य्याय-एमएम-डीडी के लिए आवश्यक प्रारूप के अनुरूप नहीं है गतिशील रूप से पंक्तियों को IE में एक <TABLE> में जोड़ नहीं सकते हैं? सीएसएस की ऊँचाई प्रतिशत काम नहीं करती EXECUTE के बाद लेन-देन की गिनती BEGIN और कमेट स्टेटमेंट की एक बेमेल संख्या दर्शाती है। पिछला गिनती = 1, वर्तमान गणना = 0 CALayer: केवल एक तरफ एक सीमा जोड़ें एक्लिप्स एंड्रॉइड प्रोजेक्ट में जेयूनिट 4 टेस्ट केस नहीं चला सकते PHP के साथ उपयोगकर्ता इनपुट को सिनिटाइज़ करने का सबसे अच्छा तरीका क्या है? getElementsByTagName () textNodes के बराबर है

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

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

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

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

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

Solutions Collecting From Web of "जावास्क्रिप्ट के 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 साइट पर एक सिंटेक्स अस्पष्टता का उल्लेख किया है, लेकिन इससे वास्तव में मेरी मदद नहीं हुई