मेरे पास थोड़ा सा जावास्क्रिप्ट कोड है जो सर्वर-साइड पर कॉन्फ़िगरेशन फ़ाइल में निर्दिष्ट है। चूंकि मैं कॉन्फ़िगरेशन भाषा (लुआ) में एक जावास्क्रिप्ट फ़ंक्शन निर्दिष्ट नहीं कर सकता, इसलिए मेरे पास यह एक स्ट्रिंग है। सर्वर कुछ JSON में स्ट्रिंग वापस आती है और मैं ग्राहक एक सफाई समारोह का उपयोग कर इसे व्याख्या है:फ़ंक्शन स्ट्रिंग को पार्स करने पर जावास्क्रिप्ट eval() "वाक्यविन्यास त्रुटि"
parse_fields = function(fields) {
for (var i = 0; i < fields.length; ++i) {
if (fields[i].sortType) {
sort_string = fields[i].sortType;
fields[i].sortType = eval(sort_string);
}
return fields;
}
};
तो बुनियादी तौर पर यह सिर्फ sortType
का मूल्यांकन करता है यदि वह मौजूद है। समस्या यह है कि फायरबग eval()
लाइन पर "सिंटेक्स त्रुटि" की रिपोर्ट कर रहा है। जब मैं फ़ायरबग कंसोल पर एक ही कदम चलाता हूं, तो यह किसी भी समस्या के साथ काम करता है और मैं जिस समारोह की अपेक्षा करता हूं, मैं इसे निष्पादित कर सकता हूं। मैंने कुछ अलग-अलग बदलावों की कोशिश की है: window.eval
सादा eval
के बजाय, sortType
को संग्रहीत करते हुए, जैसा कि मैंने उपरोक्त किया है, और स्ट्रिंग में छोटी भिन्नताओं को आजमाएं।
fields[i].sortType
का नमूना मान "function(value) { return Math.abs(value); }"
है।
>>> sort_string
"function(value) { return Math.abs(value); }"
>>> eval(sort_string)
function()
>>> eval(sort_string)(-1)
1
और खुद त्रुटि Firebug में: यहां परीक्षण मैं Firebug कंसोल में किया था है
syntax error
[Break on this error] function(value) { return Math.abs(value); }
पिछले बिट है कि प्रासंगिक हो सकता है कि यह सब एक Ext जे एस onReady()
समारोह में लपेटा जाता है है, शीर्ष पर Ext.ns
नामस्थान परिवर्तन के साथ। लेकिन मुझे लगता है कि window.eval
वैश्विक eval
को कॉल करेगा, चाहे किसी भी संभावित eval
को अधिक विशिष्ट नामस्थानों में ध्यान दिए बिना।
किसी भी विचार की सराहना की जाती है।
ध्यान दें कि आईई कर सकते हैं eval नहीं काम करता है। – SLaks
'var foo = function (value) {...} ' –
@Slaks:' eval' उपर्युक्त स्ट्रिंग के लिए IE में मेरे लिए ठीक काम करता है, कोई त्रुटि नहीं ... जैसा कि eval ("a = function () {वापसी 'बी';} ") '- क्या आप स्पष्ट कर सकते हैं कि आप क्या मतलब चाहते हैं? –