जावा पर केवल ब्लॉक स्कूपिंग के साथ जावास्क्रिप्ट डिफॉल्ट तर्क विफल हो जाते हैं


9

try {
  const val = 'correct value';
  (() => {
    ((arg = val) => {
      const val = 'ignored value';
      alert(arg);
    })();
  })();
} catch (err) {
  alert(err.message || 'Unknown error');
}

ओएस एक्स क्रोम, ओएस एक्स सफारी, एंड्रॉइड क्रोम, विंडोज क्रोम, विंडोज फ़ायरफ़ॉक्स और यहां तक ​​कि विंडोज एज पर, यह "सही मूल्य" को अलर्ट करता है। आईओएस सफारी और आईओएस क्रोम पर, यह अलर्ट "वेरिएबल नहीं पा सकता है: वैल"।

निम्नलिखित स्निपेट सभी iOS पर काम करते हैं:

डिफ़ॉल्ट तर्क (स्निपेट 2) का उपयोग नहीं करना:

try {
  const val = 'correct value';
  (() => {
    alert(val);
    (() => {
      const val = 'wrong value';
    })();
  })();
} catch (err) {
  alert(err.message || 'Unknown error');
}

कोई नेस्टेड फ़ंक्शन (स्निपेट 3):

try {
  const val = 'correct value';
  ((arg = val) => {
    const val = 'ignored value';
    alert(val || 'wrong value');
  })();
} catch (err) {
  alert(err.message || 'Unknown error');
}

ओवरराइडिंग वैरिएबल (स्निपेट 4):

try {
  const val = 'correct value';
  (() => {
    ((arg = val) => {
      alert(arg);
    })();
  })();
} catch (err) {
  alert(err.message || 'Unknown error');
}

फ़ंक्शन के बजाय ब्लॉक गुंजाइश (स्निपेट 5):

try {
  const val = 'correct value';
  {
    ((arg = val) => {
      const val = 'ignored value';
      alert(arg);
    })();
  }
} catch (err) {
  alert(err.message || 'Unknown error');
}

टुकड़ा 3 के आधार पर, यह स्पष्ट है कि valमें arg = valमाता-पिता गुंजाइश, नहीं आंतरिक समारोह के दायरे से आना चाहिए।

पहले स्निपेट में, ब्राउज़र valवर्तमान स्कोप में नहीं मिल सकता है , लेकिन पूर्वज स्कोप्स की जाँच करने के बजाय, यह चाइल्ड स्कोप का उपयोग करता है, जो टेम्पोरल डेड ज़ोन का कारण बनता है।

क्या यह iOS बग है या मैं उचित JS व्यवहार को गलत समझ रहा हूं?

यह बग हमारे Webpack + Babel + Terser आउटपुट में हो रहा है, इसलिए हम इस बग से बचने के लिए कोड को दोबारा नहीं लिख सकते।

जवाबों:


3

मुझे लगता है कि यह परम डिफ़ॉल्ट मूल्यों और उनके TDZ के एक छोटी गाड़ी कार्यान्वयन का एक अवांछित परिणाम है । मुझे संदेह है कि iOS सफारी को लगता है कि आप कुछ ऐसा काम करने की कोशिश कर रहे हैं जिसे आपने अभी तक शुरू नहीं किया है।

संदर्भ के लिए - त्रुटि स्थान:

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


वर्कअराउंड 1 एक आंतरिक स्कोप कांस्टेबल w / एक ही नाम को डिफ़ॉल्ट पैराम और बाहरी स्कोप के एक के रूप में इनिशियलाइज़ न करें

try {
    const val = 'correct value';
    (() => {
        ((arg = val) => {
            const val_ = 'ignored value';       // <----
            alert(arg);
        })();
    })();
} catch (err) {
    console.error(err);
    console.error('msg', err.message || 'Unknown error');
}

समाधान २

इसके लिए बाध्य constकरें let:

try {
    let val = 'correct value';                 // <----
    (() => {
        ((arg = val) => {
            const val = 'ignored value';
            alert(arg);
        })();
    })();
} catch (err) {
    console.error(err);
    console.error('msg', err.message || 'Unknown error');
}

वर्कअराउंड 3const val अंतरतम क्लोजर में बिल्कुल भी पुनर्निवेश न करें :

try {
    const val = 'correct value';
    (() => {
        ((arg = val) => {
            // const val = 'ignored value';      // <--
            alert(arg);
        })();
    })();
} catch (err) {
    console.error(err);
    console.error('msg', err.message || 'Unknown error');
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.