try {
const val = 'correct value';
(() => {
((arg = val) => {
const val = 'ignored value';
alert(arg);
})();
})();
} catch (err) {
alert(err.message || 'Unknown error');
}
У ОС OS X Chrome, OS X Safari, Android Chrome, Windows Chrome, Windows Firefox і навіть Windows Edge він попереджає про "правильне значення". На iOS Safari та iOS Chrome він попереджає "Не вдається знайти змінну: val".
Наступні фрагменти працюють на 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, тому ми не можемо просто переписати код, щоб уникнути цієї помилки.