2017-07-17 6 views
8

मैं जॉन रेसिग & भालू बिबाउल्ट द्वारा लिखित "जावास्क्रिप्ट निंजा के रहस्य" नामक एक महान पुस्तक पढ़ रहा हूं। अध्याय 3.2 में, यह एक उदाहरण देता है;जावास्क्रिप्ट में अनाम कार्यों का नाम क्यों है?

var canFly = function(){ return true; }; 

फिर यह कहता है;

एक अज्ञात फ़ंक्शन बनाया गया है और कैनफ़्लो नामक वैश्विक चर को असाइन किया गया है। जावास्क्रिप्ट की कार्यात्मक प्रकृति के कारण, फ़ंक्शन को इस संदर्भ के माध्यम से canFly() के रूप में बुलाया जा सकता है। इस संबंध में, यह लगभग "कार्यात्मक" नामक नामित फ़ंक्शन घोषित करने के लगभग कार्यात्मक रूप से समतुल्य है, लेकिन काफी नहीं। एक बड़ा अंतर यह है कि फ़ंक्शन का नाम संपत्ति "" है, न कि "canfly"।

लेकिन जब मैं Chrome की डेवलपर टूल पर उदाहरण निष्पादित और canFly समारोह के name संपत्ति का निरीक्षण करने की कोशिश है, यह मूल्य "canFly" के बजाय कोई रिक्त स्ट्रिंग देता है।

canFly.name; 
// > "canFly" 

क्या चर के लिए असाइन किए गए अज्ञात कार्यों के पहले के दिनों में कोई नाम नहीं है? यदि हां, तो क्या बदल गया है? या लेखकों ने गलती की?

+1

मुझे याद नहीं है कि मैंने इसे कहाँ पढ़ा है, लेकिन मुझे याद है कि नोड/वी 8 के नए संस्करणों में भी एक चर को आवंटित किए जाने पर अज्ञात फ़ंक्शंस वेरिएबल नाम प्राप्त करेंगे। जब मुझे कोई लिंक मिल जाए तो उत्तर पोस्ट करेगा। – Aron

+9

[* अनुमानित फ़ंक्शन नाम *: चर और विधियां किसी अज्ञात फ़ंक्शन के नाम को इसकी वाक्य रचनात्मक स्थिति (ईसीएमएस्क्रिप्ट 2015 में नया) से अनुमानित कर सकती हैं] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/संदर्भ/Global_Objects/फंक्शन/नाम # Inferred_function_names) –

+1

वहां हम जाते हैं। धन्यवाद @ एलेक्सके। – Aron

उत्तर

2

सिद्धांत में अज्ञात कार्य अनौपचारिक हैं, जिसका अर्थ नामहीन है। इस तरह यह मूल रूप से कार्यान्वित किया गया था और दस साल से अधिक के लिए सभी इस के साथ ठीक थे।

फिर दो चीजें हुईं: संपूर्ण वेब 2.0/AJAX आंदोलन जहां लोगों ने वेब पृष्ठों और node.js. में डेस्कटॉप ऐप्स पर आमतौर पर यूआई विशेषताओं को लागू करना शुरू किया। संयोजन में इन दोनों ने अधिक से अधिक डेवलपर्स को जावास्क्रिप्ट को एक गंभीर भाषा के रूप में इलाज करने के लिए मजबूर किया और एक बार लोगों को जावास्क्रिप्ट के साथ सहज महसूस करने के बाद उन्होंने वास्तव में बड़े कोडबेस लिखना शुरू कर दिया।

इससे जावास्क्रिप्ट की डिबग्बिलिटी के बारे में शिकायतें हुईं। कोई उपयोगी डीबगर नहीं होने से कई लोग थे (जिसने हमें उन ब्राउज़रों में वास्तव में अच्छे डिबगर्स का नेतृत्व किया जो मेरी राय में केवल एमएस विजुअल स्टूडियो के लिए सबसे अच्छा है) यह जानने के लिए कि console.log क्या काम करता है (क्योंकि वे अज्ञात हैं) ।

इससे ब्राउज़र और जेएस इंजन डेवलपर्स को कोड लागू करने के लिए प्रेरित किया गया जो नामहीन कार्यों के "नाम" का अनुमान लगाने का प्रयास करता है।

सिद्धांत में यह सुविधा गलत है क्योंकि आप हमेशा यह गारंटी नहीं दे सकते कि आप अनुमान लगा रहे हैं कि फ़ंक्शन कहलाता है (उदाहरण के लिए यदि फ़ंक्शन को कई अलग-अलग चरों में असाइन किया गया है)। अभ्यास में जो कुछ भी 90% काम करता है वह कुछ भी नहीं है। MDN में हम देख सकते हैं

var canFly = function() {}; 
 
var areYouSure = function yesIAm(){}; 
 
console.log(canFly.name); 
 
console.log(areYouSure.name); 
 
console.log((function(){}).name);

जानकारी के लिए जांच की जा रही:

+1

दिलचस्प बात यह है कि जॉन रेसिग की पुस्तक 2008 में प्रकाशित हुई थी, जिससे हमें 2008 और 2017 के बीच एक कठिन समयरेखा मिलती है जब इस सुविधा को पहली बार लागू किया गया था। मेरा मानना ​​है कि यदि आप वास्तव में उत्सुक हैं तो कोड कोड के लिए विभिन्न जेएस इंजनों के स्रोत कोड के आसपास खोद सकते हैं। ऐप्पल का जावास्क्रिप्टकोर (नाइट्रो), Google का वी 8 और माइक्रोसॉफ्ट का चक्रक्रैक सभी ओपन सोर्स हैं। – slebetman

+0

बहुत बहुत धन्यवाद! ऐसा लगता है कि मुझे ब्राउजर इंजन के स्रोत कोड को समझने के लिए सी/सी ++ सीखना है, लेकिन मुझे लगता है कि मेरे प्रश्न के उत्तर की गहरी समझ और जेएस वास्तव में दृश्यों के पीछे कैसे काम करता है। –

1

यहाँ कि एक सुराग कि .name सिर्फ सहायक हो वास्तव में कड़ी मेहनत की कोशिश कर रहा हो सकता है देता है अपने परीक्षण कोड का थोडा सा बदलाव किया संस्करण है यह एक गैर-मानक संपत्ति होता था:

function.name संपत्ति रिटर्न देता है समारोह का नाम

...कि ES2015 (जोर मेरा) में अपना रास्ता बनाया:

चर और तरीकों अपने वाक्यात्मक स्थिति (ECMAScript 2015 में नया) से एक गुमनाम समारोह के नाम पर अनुमान लगा सकते हैं।

तो यह नाम लौटाता है, लेकिन जब यह नहीं हो सकता है, तो यह अनुमान लगाने का प्रयास करता है।

+0

धन्यवाद! इसका अर्थ यह है कि अज्ञात कार्यों में केवल 'नाम' संपत्ति खाली होती है अगर उन्होंने एक चर को असाइन नहीं किया है। –

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