2016-08-12 11 views
14

कोड का यह टुकड़ा, जबकि गूगल क्रोम 52.0.2743.116 पर Uncaught ReferenceError: f is not defined के कारणReferenceError गूगल क्रोम पर लेकिन Firefox पर नहीं (ब्राउज़र बग?)

eval(` 
 
    let a = 0; 
 
    function f() {} 
 
    function g() { a; } 
 
    console.log(f); 
 
`);

फ़ायरफ़ॉक्स 48.0 पर ठीक काम करता है (64 बिट)।

यह भी अगर

  • eval नहीं किया जाता है गूगल क्रोम पर ठीक काम करता है, या
  • eval अंदर कोड {} साथ चारों ओर जाता है, या
  • ag में संदर्भित नहीं है, या
  • letvar में बदल दिया गया है, या
  • "use strict" कोड

से पहले जोड़ा गया है क्या हो रहा है?

उत्तर

1

ऐसा लगता है कि यह a novel V8 bug है! एक और अधिक कम से कम परीक्षण का मामला

eval(` 
    var f; 
    let a; 
    ()=>a 
`); 
f; 

चर-दायरे वाले घोषणाओं है (जो उच्च-स्तरीय समारोह घोषणाओं भी शामिल है) ठीक से गैर सख्त eval कॉल से बाहर फहराया नहीं हो रहे हैं जब कॉल भी एक nontrivial शाब्दिक घोषणा की है।

2
eval(` 
    "use strict"; 
    let a = 0; 
    console.log(f); 
    function f(){ 
    } 
    function g(){ 
     a; 
    } 
`); 

ब्लॉक-दायरे घोषणाओं (चलो, स्थिरांक, समारोह, वर्ग) अभी तक समर्थित नहीं बाहर सख्त मोड

+1

[एमडीएन] (https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Statements/let#Browser_compatibility) के अनुसार क्रोम 49.0 के बाद से 'sl' को मैला मोड में समर्थित किया गया है)। – johnchen902

+1

आह ... मैं v47 का उपयोग कर रहा हूँ ... – strah

5

अपने उदाहरण आप देख सकते हैं क्या हो रहा है, और जब आदेश एक सा है ट्वीक विरोधाभासी, यह एक बग की तरह दिखता है। एक को फ़ंक्शन के रूप में परिभाषित करें और 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 में सख्त का उपयोग वैश्विक क्षेत्र में जोड़े जाने की चर, तो फिर से रोकता है, संभाल करने के लिए "आसान"। वैश्विक कार्यों से जुड़े होने की आवश्यकता होने के बीच कोई मेल नहीं खाता।
संबंधित मुद्दे