2011-10-16 13 views
5

जावास्क्रिप्ट एप्लिकेशन के लिए मुझे उपयोगकर्ता को किसी ऑब्जेक्ट की स्थिति को सहेजने में सक्षम होना चाहिए। इसमें कस्टम फ़ंक्शंस का एक सेट सहेजना शामिल है जो पहले गतिशील रूप से या जीयूआई के माध्यम से बनाए गए थे, और बाद में इन संग्रहीत कार्यों को लोड कर रहे थे। अनिवार्य रूप से मुझे कार्यों को क्रमबद्ध और अनुक्रमित करने की आवश्यकता है।जावास्क्रिप्ट के फ़ंक्शन के लिए उलटा ऑपरेशन .toString()

अभी मैं समारोह वस्तु की .toString() विधि का उपयोग कर serialize हिस्सा प्राप्त:

func.toString().replace('"', '\"').replace(/(\r)/g, ' ').replace(/(\n)/g, ' ').replace(/(\t)/g, ' ') 

यह मैं देता इस सुंदरता की तरह "धारावाहिक" कार्यों (ध्यान दें समारोह अज्ञात है कि):

"function (someParameter) {this.someFunctionName(return 'something';}" 

यह अनजाने में है जहां मैं संघर्ष करता हूं।

var func = eval('t =' + so.actions[i].func); 

नोट कैसे मैं इस पर eval() कॉल करने से पहले t = साथ धारावाहिक समारोह पहले जोड़ें: कार्यों unserializing के लिए मेरे वर्तमान का सबसे अच्छा समाधान यह है। मुझे ऐसा करना पसंद नहीं है क्योंकि यह एक वैश्विक चर बनाता है लेकिन मुझे इसके चारों ओर एक रास्ता नहीं मिल रहा है। । जब var t =, eval() prepending समारोह लेकिन undefined वापस नहीं करता है

वहाँ करने के लिए "unserialize" एक अनाम समारोह कर रहे हैं वैकल्पिक तरीकों

: जब इस prepending नहीं, मैं एक "अप्रत्याशित टोकन (सिंटैक्स त्रुटि" प्राप्त करते हैं।?

पीएस: मुझे उपयोगकर्ता इनपुट पर eval() का उपयोग करने के सुरक्षा प्रभावों से अवगत है। निकट भविष्य के लिए मैं इस सॉफ्टवेयर का एकमात्र उपयोगकर्ता हूं, इसलिए यह वर्तमान में एक गैर-मुद्दा है।

उत्तर

6

आप फ़ंक्शन का उपयोग कर सकते हैं वैश्विक चर बनाने से बचने के लिए कन्स्ट्रक्टर:

var func = Function("return " + so.actions[i].func)(); 
सावधान रहने की, आसपास बंद है जो आप पर कब्जा करने में सक्षम नहीं होगा है तो समारोह के अंदर चर "परिवर्तन" जब आप को क्रमानुसार और डे होगा

var func = eval("(function() { return " + so.actions[i].func + " })()"); 

एक बात:

इस के बराबर है क्रमबद्ध करें।

संपादित

मैं सोच नहीं कर रहा हूँ, तो आप निश्चित रूप से सिर्फ कर सकते हैं:

var func = eval("(" + so.actions[i].func + ")"); 
+0

बंद का ध्यान रखा जाता है। इन कार्यों को केवल 'Function.call (theContextTheFunctionIsExecutedIn)' का उपयोग करके निष्पादित किया जाता है। उस तरफ से सीरियलाइज्ड फ़ंक्शन को ब्रैकेट के साथ घूमने के लिए आपका सुझाव - क्या आपको पता है क्यों? – jonemo

+1

[एमडीएन] (https://developer.mozilla.org/en/JavaScript/Reference/Functions_and_function_scope) के अनुसार, माता-पिता इसे एक फ़ंक्शन * घोषणा * से फ़ंक्शन * अभिव्यक्ति * में बदलते हैं। (यह माता-पिता में अभिव्यक्ति का हिस्सा है।) चूंकि यह एक अभिव्यक्ति है, यह एक मान वापस कर देगा, जिसे आप 'func' को असाइन कर सकते हैं। यह उस क्षेत्र पर भी निर्भर हो सकता है जिस पर eval वर्तमान में है। –

+0

यह भी देखें http://kangax.github.com/nfe/ – user123444555621

संबंधित मुद्दे