console.log
मानकीकृत नहीं है, इसलिए व्यवहार को अपरिभाषित किया जाता है, और रिलीज़ से डेवलपर टूल के रिलीज़ तक आसानी से बदला जा सकता है। आपकी पुस्तक पुरानी होने की संभावना है, जैसा कि मेरा जवाब जल्द ही हो सकता है।
हमारे कोड के लिए, यह कोई अंतर नहीं console.log
है कि क्या यह async है या नहीं, यह किसी भी प्रकार की कॉलबैक या तो प्रदान नहीं करता है; और आपके द्वारा पास किए गए मान हमेशा फ़ंक्शन को कॉल करते समय संदर्भित और गणना किए जाते हैं।
हम वास्तव में नहीं जानते हैं कि तब क्या होता है (ठीक है, हम कर सकते हैं, क्योंकि फायरबग, क्रोम देवटूल और ओपेरा ड्रैगनफ्लाई सभी खुले स्रोत हैं)। कंसोल को लॉग किए गए मानों को कहीं स्टोर करने की आवश्यकता होगी, और यह उन्हें स्क्रीन पर प्रदर्शित करेगा। रेंडरिंग सुनिश्चित करने के लिए एसिंक्रोनस रूप से घटित होगी (दर-सीमा अपडेट के लिए थ्रॉटल किया जा रहा है), क्योंकि कंसोल में लॉग की गई वस्तुओं के साथ भविष्य के इंटरैक्शन (जैसे ऑब्जेक्ट ऑब्जेक्ट का विस्तार करना) होगा।
तो कंसोल या तो क्लोन (अनुक्रमित) कर सकता है जो आप द्वारा लॉग किए गए उत्परिवर्तनीय वस्तुओं को, या यह उनके संदर्भों को संग्रहीत करेगा। पहले वाला गहरी / बड़ी वस्तुओं के साथ अच्छा काम नहीं करता है। इसके अलावा, कम से कम कंसोल में प्रारंभिक रेंडरिंग संभवतः ऑब्जेक्ट की "वर्तमान" स्थिति को दिखाएगा, अर्थात जब यह लॉग इन हुआ - तो आपके उदाहरण में आप देखेंगे Object {}
।
हालाँकि, जब आप ऑब्जेक्ट को उसके गुणों का निरीक्षण करने के लिए आगे बढ़ाते हैं, तो यह संभावना है कि कंसोल ने केवल आपके ऑब्जेक्ट और उसके गुणों का संदर्भ संग्रहीत किया होगा, और अब उन्हें प्रदर्शित करना उनकी वर्तमान (पहले से उत्परिवर्तित) स्थिति को दिखाएगा। यदि आप पर क्लिक करते हैं +
, तो आपको bar
अपने उदाहरण में संपत्ति देखने में सक्षम होना चाहिए ।
यहाँ एक स्क्रीनशॉट है जो बग रिपोर्ट में उनके "फिक्स" को समझाने के लिए पोस्ट किया गया था :
इसलिए, कुछ मानों को लॉग किए जाने के लंबे समय बाद संदर्भित किया जा सकता है, और इनका मूल्यांकन बल्कि आलसी है ("जब आवश्यक हो")। इस विसंगति का सबसे प्रसिद्ध उदाहरण प्रश्न में संभाला है क्रोम के जावास्क्रिप्ट कंसोल सरणियों के मूल्यांकन के बारे में आलसी है?
एक वर्कअराउंड यह सुनिश्चित करना है कि हमेशा अपनी वस्तुओं के क्रमबद्ध स्नैपशॉट लॉग करें, जैसे कि करके console.log(JSON.stringify(obj))
। यह गैर-परिपत्र और बल्कि छोटी वस्तुओं के लिए काम करेगा, हालांकि। यह भी देखें कि मैं सफारी में कंसोल.लॉग के डिफ़ॉल्ट व्यवहार को कैसे बदल सकता हूं? ।
बेहतर समाधान डिबगिंग के लिए ब्रेकपॉइंट्स का उपयोग करना है, जहां निष्पादन पूरी तरह से बंद हो जाता है और आप प्रत्येक बिंदु पर वर्तमान मानों का निरीक्षण कर सकते हैं। केवल क्रमिक और अपरिवर्तनीय डेटा के साथ लॉगिंग का उपयोग करें।