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 आउटपुट में हो रहा है, इसलिए हम इस बग से बचने के लिए कोड को दोबारा नहीं लिख सकते।