2015-12-04 7 views
6

मैं एक निर्माता के रूप में एक अजीब तरीके से eval फ़ंक्शन का उपयोग कर रहा हूं।सभी जावास्क्रिप्ट फ़ंक्शंस कन्स्ट्रक्टर भी नहीं हैं?

try { 
    var y = new eval() 
} catch(error) { 
    console.log("caught a " + error.name + ": " + error.message); 
} 

यह रूप में त्रुटि फेंकता है,

caught a TypeError: function eval() { [native code] } is not a constructor 

त्रुटि संदेश से पता चलता है, eval एक समारोह लेकिन एक निर्माता नहीं है।

सवाल यह है कि, सभी जावास्क्रिप्ट फ़ंक्शंस कन्स्ट्रक्टर के रूप में भी कार्य नहीं करते हैं?

+0

eval एक आरक्षित कीवर्ड/एक मूल कार्य है। इसके साथ गड़बड़ मत करो। –

+2

नहीं, कुछ अन्य उल्लेखनीय अपवाद कुछ _DOM_ विधियां हैं और _arrow functions_ 'x => अपरिभाषित' –

+0

सहमत हैं, eval एक अंतर्निहित फ़ंक्शन है। यदि आपने अपना स्वयं का 'फ़ंक्शन myEval() {} 'बनाया है और फिर उस कोड का उपयोग किया जाना चाहिए तो यह ठीक होना चाहिए। –

उत्तर

6

सभी कार्य कन्स्ट्रक्टर नहीं हैं।

कन्स्ट्रक्टर function values with a [[Construct]] internal property हैं, जो सभी कार्यों में नहीं हैं। यह भाषा विशेष का 6.1.7.2 Object Internal Methods and Internal Slots में स्पष्ट किया जाता है:

एक समारोह वस्तु जरूरी नहीं है एक निर्माता और इस तरह के गैर निर्माता समारोह वस्तुओं एक [[निर्माण]] आंतरिक विधि नहीं है।

new या Reflect.construct का प्रयोग के रूप में एक निर्माता एक TypeError फेंकता है एक गैर निर्माता कॉल करने के लिए।

+0

इसका व्यावहारिक प्रभाव क्या है? यदि मैं जावास्क्रिप्ट फ़ंक्शन लिखता हूं, तो क्या यह स्वचालित रूप से इस [[निर्माण]] आंतरिक विधि से टैग किया जाता है? –

+0

@ जॉन क्रेंटर, यह इस बात पर निर्भर करता है कि फ़ंक्शन कैसे बनाया जाता है। जैसा कि @PaulS ऊपर बताता है, तीर फ़ंक्शन सिंटैक्स का उपयोग करके फ़ंक्शन बनाना मतलब है कि इसमें [[निर्माण]] संपत्ति नहीं होगी। 'फ़ंक्शन' कीवर्ड का उपयोग करना आम तौर पर एक निर्माण-सक्षम फ़ंक्शन का उत्पादन करेगा। –

+0

हू, इसे उन चीज़ों की सूची में जोड़ें जिन्हें मैं नहीं जानता था कि मुझे नहीं पता था। –

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