जावास्क्रिप्ट फंक्शन एक्सप्रेशन को मेमोरी में कैसे रखें?
let sayBye = function () {
console.log(`Bye`);
}
let bye = sayBye;
sayBye = null; // X
bye(); // Y
यह सवाल पूछने से पहले, मैंने Google में खोज की और मुझे यह पोस्ट मिली ।
फिर मैंने सोचा, लाइन एक्स से पहले संरचना इस तरह से है:
sayBye ---------------
|
| => function() {....}
|
bye-------------------
एक्स लाइन के बाद, मैंने सोचा कि यह इस तरह था:
sayBye MEMORY
| => function() {....}
|
bye-------------------
लेकिन जब मैंने फ़ायरफ़ॉक्स डेवलपर टूल में अलविदा लिखा तो मैंने यह देखा
यह कैसे संभव है? जब मैंने लिखा let bye = sayBye;है कहो क्या सिपाही है?
let sayBye = function () {
console.log(`Bye`);
}
let bye = sayBye;
sayBye = null; // X
bye(); // Y
console.log(bye);
जवाब
से https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name#Inferred_function_names:
विविधताएं और विधियाँ एक अनाम फ़ंक्शन का नाम अपने सिंटैक्टिक स्थिति (ECMAScript 2015 में नया) से हटा सकती हैं।
क्रोम और फ़ायरफ़ॉक्स दोनों "sayBye"ही छपाई करते समय देते हैं bye.name।
व्यक्तिगत प्रयोगों से, क्रोम कंसोल दिखाते हैं, bye.toString()जब पूछते हैं bye, जबकि फ़ायरफ़ॉक्स उनके एक कस्टम आउटपुट दिखाता है, जहां वे फ़ंक्शन का अनुमानित नाम प्रदर्शित करते हैं (जो वास्तव में समझ में आता है, जैसा कि नाम को जानना आमतौर पर डीबगिंग में मदद करता है)।
कार्य ऑब्जेक्ट हैं इसलिए असाइनमेंट x = y की प्रतिलिपि नहीं बनाई गई है। मैं इस Nodejs मुझे मिला की कोशिश की
Bye
[Function: sayBye]
यदि आप एक फ़ंक्शन का नाम नहीं देते हैं, तो JS स्वतः ही इसमें नाम जोड़ देगा। ES6 में आप myFunction.name का उपयोग करके फ़ंक्शन के नाम की जांच कर सकते हैं , अर्थात 'नाम' एक फ़ंक्शन ऑब्जेक्ट की संपत्ति है। महत्वपूर्ण बात यह है कि यह केवल संपत्ति पढ़ी जाती है। फंक्शन एक्सप्रेशन का उपयोग constकरने के बजाय अच्छा अभ्यास करना है। letइसके अलावा, यदि संभव हो, तो कॉल स्टैक पर फ़ंक्शन डीबगिंग को नाम देना आसान है
आप फ़ंक्शन के नाम से भ्रमित हैं।
मेमोरी चीजें ठीक उसी तरह से होती हैं जैसे आपने सोचा था।
हालांकि, समारोह तो ब्राउज़र एक दिया एक स्पष्ट नाम नहीं था, अंतर्निहित नाम समारोह, चर या वस्तु संपत्ति यह किया गया था का नाम है कि करने के लिए पहले , इस मामले में, करने के लिए सौंपा sayBye।
फिर, इसे किसी भिन्न चर में असाइन किया जाता है, लेकिन नाम परिवर्तित नहीं होता है।
आप इसे देख सकते हैं यदि आप इसे एक स्पष्ट नाम देते हैं:
// Explicit name ----vvvv
let sayBye = function myFn() {
console.log(`Bye`);
}
let bye = sayBye;
sayBye = null; // X
bye(); // Y
console.log(bye);