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 Край, он предупреждает "правильное значение". В 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
в текущей области, но вместо проверки областей предка он использует дочернюю область, которая вызывает временную мертвую зону.
Is это ошибка iOS или я неправильно понимаю правильное поведение JS?
Эта ошибка возникает в нашем выводе Webpack + Babel + Terser, поэтому мы не можем просто переписать код, чтобы избежать этой ошибки.