दिलचस्प पोस्ट
Srand को शुरू करने का अनुशंसित तरीका है? पंजीकरण के बाद स्वचालित उपयोगकर्ता पंजीकरण निजी और संरक्षित सदस्य: सी ++ 'फ्लोट' बनाम 'डबल' सटीक आप WCF ज्ञात प्रकारों को किस प्रकार कॉन्फ़िगर करते हैं? आप एक स्ट्रिंग में एक jQuery ऑब्जेक्ट कैसे परिवर्तित करते हैं? वायुसेना 2.0 के माध्यम से आईओएस छवि अपलोड कोड प्रथम: स्वतंत्र संघ बनाम विदेशी कुंजी संघों? किसी सामान्य त्रुटि (10 9 5) के कारण इस समय ऐप्लिकेशन जानकारी पर विचार करने में असमर्थ। openssl और C ++ के साथ sha256 उत्पन्न करें थ्रॉएबल और अपवाद का उपयोग करने के बीच अंतर को पकड़ने में क्यों लंबे समय के बजाय पूर्णांक का उपयोग करें? Node.js परिनियोजन सेटिंग्स / कॉन्फ़िगरेशन फ़ाइलों को कैसे संग्रहीत करें? सी ++ बीसन एक्सटेंशन लोड करने में विफल एंड्रॉइड में मैं एक बिंदीदार / धराशायी रेखा कैसे बना सकता हूं?

Chrome डीबगर को बंद क्यों नहीं लगता स्थानीय चर अपरिभाषित है?

इस कोड के साथ:

function baz() { var x = "foo"; function bar() { debugger; }; bar(); } baz(); 

मुझे यह अनपेक्षित परिणाम मिलता है:

यहां छवि विवरण दर्ज करें

जब मैं कोड बदलता हूं:

 function baz() { var x = "foo"; function bar() { x; debugger; }; bar(); } 

मुझे अपेक्षित परिणाम मिलता है:

यहां छवि विवरण दर्ज करें

इसके अलावा, यदि आंतरिक फ़ंक्शन के भीतर कोई कॉल करने के लिए कोई कॉल है, तो मैं अपना वैरिएबल एक्सेस कर सकता हूं क्योंकि मैं करना चाहता हूं (कोई बात नहीं है जो मैं eval पास करता हूं)।

इस बीच, फ़ायरफ़ॉक्स देव उपकरण दोनों परिस्थितियों में अपेक्षित व्यवहार देते हैं।

क्रोम के साथ क्या हो रहा है कि डिबगर फ़ायरफ़ॉक्स से आसानी से व्यवहार करता है? मैंने कुछ समय के लिए इस व्यवहार को देखा है, जिसमें संस्करण 41.0.2272.43 बीटा (64-बिट) शामिल है।

क्या यह है कि क्रोम के जावास्क्रिप्ट इंजन के कार्यों को जब "यह कर सकता है" को "चपटे" करता है?

दिलचस्प बात यह है कि अगर मैं एक दूसरे वैरिएबल को जोड़ता हूं जो आंतरिक फ़ंक्शन में संदर्भित है, तो x चर अभी भी अनिर्धारित है।

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

साथ ही, मैं इसे ब्रेकपॉइंट्स के साथ-साथ debugger स्टेटमेंट के साथ पुन: उत्पन्न कर सकता हूं।

वेब के समाधान से एकत्रित समाधान "Chrome डीबगर को बंद क्यों नहीं लगता स्थानीय चर अपरिभाषित है?"

मुझे एक वी 8 मुद्दे की रिपोर्ट मिल गई है जो कि आप क्या पूछ रहे हैं के बारे में ठीक है।

अब, उस मुद्दे की रिपोर्ट में जो कहा गया है संक्षेप करने के लिए … v8 उन चर को संग्रहीत कर सकता है जो स्टैक पर फ़ंक्शन के लिए स्थानीय या ढेर पर रहने वाले किसी "संदर्भ" ऑब्जेक्ट में संग्रहीत कर सकते हैं। यह स्टेक पर स्थानीय चर आवंटित करेगा, जब तक फ़ंक्शन में कोई आंतरिक फ़ंक्शन शामिल नहीं होता है जो उनके संदर्भ में है। यह अनुकूलन है अगर कोई आंतरिक फ़ंक्शन किसी स्थानीय चर को संदर्भित करता है, तो यह चर एक संदर्भ वस्तु में रखा जाएगा (अर्थात ढेर के बजाय ढेर पर)। eval का मामला विशेष है: यदि इसे किसी आंतरिक फ़ंक्शन द्वारा कहा जाता है, तो सभी स्थानीय चर संदर्भ वस्तु में डाल दिए जाते हैं।

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

डीबगर स्टैक पर मौजूद उन चर का निरीक्षण नहीं कर सकते हैं। डिबगिंग में आने वाली समस्या के बारे में, एक प्रोजेक्ट सदस्य का कहना है :

मैं सोच सकता था कि एकमात्र उपाय यह है कि जब भी devtools चालू हो, हम सभी कोड को हटा देंगे और मजबूर संदर्भ आवंटन के साथ फिर से कम्पाइल करेंगे। यह नाटकीय ढंग से devtools के साथ प्रदर्शन को फिर से चालू करना सक्षम होगा हालांकि।

यहां का एक उदाहरण है "यदि कोई भी आंतरिक फ़ंक्शन वैरिएबल को संदर्भित करता है, इसे किसी संदर्भ वस्तु में डाल दिया"। यदि आप इसे चलाते हैं तो आप debugger बयान पर x का उपयोग करने में सक्षम होंगे, भले ही x केवल foo फ़ंक्शन में प्रयोग किया जाता है, जिसे कभी भी नहीं कहा जाता है !

 function baz() { var x = "x value"; var z = "z value"; function foo () { console.log(x); } function bar() { debugger; }; bar(); } baz(); 

@ लॉयस की तरह, यह वी 8 ऑप्टिमाइज़ेशन के कारण हुआ, इसलिए debugger साथ बदलें

 eval('debugger'); 

eval वर्तमान हिस्सा deopt होगा

मैंने इसे नोडजे में भी देखा है मेरा मानना ​​है कि (और मैं मानता हूं कि यह केवल एक अनुमान है) जब कोड संकलित होता है, अगर x bar अंदर नहीं दिखाई bar , तो यह bar के दायरे में x उपलब्ध नहीं करता है यह शायद इसे थोड़ा अधिक कुशल बनाता है; समस्या यह है कि कोई भूल गया (या ध्यान नहीं दिया) भले ही कोई x bar , तो आप डिबगर को चलाने का फैसला कर सकते हैं और इसलिए अब भी अंदर से x एक्सेस करने की आवश्यकता है।

वाह, वाकई दिलचस्प!

जैसा कि दूसरों ने उल्लेख किया है, यह scope से संबंधित है, लेकिन अधिक विशेष रूप से, debugger scope से संबंधित है। इंजेक्शन वाली स्क्रिप्ट का मूल्यांकन डेवलपर टूल में किया जाता है, तो यह ScopeChain निर्धारित करने लगता है, जिसके परिणामस्वरूप कुछ quirkiness (क्योंकि यह इंस्पेक्टर / डिबगर क्षेत्र तक ही सीमित है)। आपके द्वारा जो पोस्ट की गई है उसका एक भिन्नता यह है:

(संपादित करें – असल में, आप अपने मूल प्रश्न, योक, मेरे बुरे में इसका उल्लेख करते हैं ! )

 function foo() { var x = "bat"; var y = "man"; function bar() { console.log(x); // logs "bat" debugger; // Attempting to access "y" throws the following // Uncaught ReferenceError: y is not defined // However, x is available in the scopeChain. Weird! } bar(); } foo(); 

महत्वाकांक्षी और / या उत्सुक, स्रोत (हेह) को स्रोत देखने के लिए कि क्या हो रहा है:

https://github.com/WebKit/webkit/tree/master/Source/JavaScriptCore/inspector https://github.com/WebKit/webkit/tree/master/Source/JavaScriptCore/debugger

मुझे संदेह है कि इसे चर और फ़ंक्शन उत्थापन के साथ करना है। जावास्क्रिप्ट सभी वेरिएबल और समारोह घोषणाओं को उन फ़ंक्शन के शीर्ष पर लाता है जिन्हें वे परिभाषित करते हैं। यहां अधिक जानकारी: http://jamesallardice.com/explaining-function-and-variable-hoisting-in-javascript/

मुझे यकीन है कि क्रोम ब्रेक पॉइंट को कॉल करने के लिए चर के दायरे से अनुपलब्ध है क्योंकि फ़ंक्शन में और कुछ नहीं है यह काम करने लगता है:

 function baz() { var x = "foo"; function bar() { console.log(x); debugger; }; bar(); }