अपने उदाहरण आप देख सकते हैं क्या हो रहा है, और जब आदेश एक सा है ट्वीक विरोधाभासी, यह एक बग की तरह दिखता है। एक को फ़ंक्शन के रूप में परिभाषित करें और f के बजाय इसे लॉग करें, फिर कंसोल पर एक नज़र डालें। आप देखेंगे कि ए, एफ और जी के साथ एक बंद किया गया था। चूंकि जी में संदर्भित है, और एफ और जी एक दूसरे के लिए दृश्यमान होना चाहिए, यह थोड़ा सा समझ में आता है। लेकिन वैश्विक दायरे में eval काम करता है। तो जब आप उन्हें एक्सेस करने का प्रयास करते हैं, तो आप अपरिभाषित हो जाते हैं। ऐसा लगता है कि इस बंद को कहीं से भी नहीं पहुंचा जा सकता है।
प्रयास करें:
eval('let a = function(){}; function f() {};function g(){a;};console.dir(a);');
आप कंसोल में इस देखेंगे:
<function scope>
Closure
a: function()
f: function f()
g: function g()
सभी अपने अन्य मामलों स्थिति स्पष्ट करने, और समस्या से बचने के:
- eval का उपयोग नहीं किया जाता है: दायरा गलत मैच, कम स्पष्ट है
- eval अंदर कोड {} साथ चारों ओर जाता है: चर एक ब्लॉक गुंजाइश के माध्यम से जुड़े हुए हैं।
- एक ग्राम में संदर्भित नहीं है: एक बंद करने के लिए कोई जरूरत नहीं है, तो चर जुड़े हुए नहीं हैं।
- दें वर करने के लिए बदल जाता है: वैश्विक क्षेत्र में वर वैश्विक दायरे में परिभाषित किया गया है। तो कोई बंद की जरूरत
- "सख्त का उपयोग करें" कोड पहले जोड़ा जाता है: eval में सख्त का उपयोग वैश्विक क्षेत्र में जोड़े जाने की चर, तो फिर से रोकता है, संभाल करने के लिए "आसान"। वैश्विक कार्यों से जुड़े होने की आवश्यकता होने के बीच कोई मेल नहीं खाता।
स्रोत
2016-08-17 05:34:34
[एमडीएन] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/let#Browser_compatibility) के अनुसार क्रोम 49.0 के बाद से 'sl' को मैला मोड में समर्थित किया गया है)। – johnchen902
आह ... मैं v47 का उपयोग कर रहा हूँ ... – strah