2013-05-08 4 views
5

मैं AJAX के माध्यम से एक स्क्रिप्ट फ़ाइल लोड कर रहा हूँ, और मैं यह कर रहा हूँ अपनी सामग्री को चलाने के लिए:उपयोग जारी करता

new Function('someargument',xhr.responseText)(somevalue); 

हालांकि, MDN के अनुसार:

FunctionFunction कन्स्ट्रक्टर के साथ बनाए गए ऑब्जेक्ट्स फ़ंक्शन बनने पर पार्स किए जाते हैं। यह फ़ंक्शन घोषित करने और इसे आपके कोड में कॉल करने से कम कुशल है, क्योंकि फंक्शन स्टेटमेंट के साथ घोषित फ़ंक्शंस को शेष कोड के साथ पार्स किया जाता है।

मुझे वास्तव में यह काफी नहीं मिलता है। यदि कोई फ़ंक्शन घोषित किया गया है, तो उसे अभी भी फ़ाइल के स्ट्रिंग प्रारूप से पार्स किया जाना चाहिए, तो new Function के माध्यम से लोड की गई स्ट्रिंग क्यों चलाना कम कुशल होगा?

यह वास्तव में मेरे लिए जिज्ञासा की बात है। मैं समझ सकता हूं कि यह एक लूप में क्यों खराब होगा (उसी स्ट्रिंग को दोबारा पर्स करना होगा), लेकिन इस तरह के कुछ के लिए मुझे नहीं लगता कि कोई समस्या है, है ना?

+2

यह लगभग eval की तरह पार्स किया गया है, जो धीमा होने के लिए जाना जाता है। मुझे लगता है * यह थोड़ा तेज होना चाहिए, क्योंकि स्कोप चेन को हुक नहीं करना है। – bfavaretto

+0

AJAX द्वारा फ़ंक्शन न भेजें, डेटा भेजें। अपने कार्यों को _.js_ या '

6

मुझे लगता है कि वे क्या कह रहे हैं यह है कि आप इस तरह से अपने कोड में समारोह निर्माता का उपयोग करते हैं:

new Function('bar', 'console.log(bar);')); 

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

1

मुझे नहीं पता कि उस एमडीएन लेख के लेखक का इरादा क्या है, लेकिन यहां एक व्याख्या है।

कई आधुनिक जेएस दुभाषिया देशी कोड बनाने के लिए एक अनुकूलन कंपाइलर का उपयोग करते हैं।

उदाहरण के लिए, "JavaScriptCore, the WebKit JS implementation" का कहना है:

तीन रूपों के बीच

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

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

जब आप new Function पर कॉल करते हैं, तो अनुकूलन कंपाइलर को उन और अन्य अनुकूलन करने के लिए आवश्यक संदर्भ नहीं मिलता है।

+0

ठीक है, तो यह मेरी स्थिति पर कैसे लागू होगा: 'नया फ़ंक्शन' का उपयोग करने वाला कोड एक प्रीलोडर है, और जिस कोड को पार्स किया जा रहा है वह उस गेम के लिए वास्तविक स्क्रिप्ट है जिस पर मैं काम कर रहा हूं। –

+1

@ कोलिंक, क्या यह आपकी स्थिति पर लागू होता है? क्या आपने यह देखने के लिए बेंचमार्क किया है कि इसका कोई प्रदर्शन प्रभाव है या नहीं? डेटा एकत्र करने में आसान होने पर डेटा के बिना प्रदर्शन निर्णय न लें। बस आपके पास क्या है, और समकक्ष '