try {
const val = 'correct value';
(() => {
((arg = val) => {
const val = 'ignored value';
alert(arg);
})();
})();
} catch (err) {
alert(err.message || 'Unknown error');
}
No OS X Chrome, no OS X Safari, no Android Chrome, no Windows Chrome, no Windows Firefox e até no Windows Edge, ele alerta "valor correto". No iOS Safari e iOS Chrome, ele alerta "Não é possível encontrar a variável: val".
Os seguintes snippets funcionam no iOS:
Não usando o argumento padrão (snippet 2):
try {
const val = 'correct value';
(() => {
alert(val);
(() => {
const val = 'wrong value';
})();
})();
} catch (err) {
alert(err.message || 'Unknown error');
}
Nenhuma função aninhada (trecho 3):
try {
const val = 'correct value';
((arg = val) => {
const val = 'ignored value';
alert(val || 'wrong value');
})();
} catch (err) {
alert(err.message || 'Unknown error');
}
Variável não substituindo (trecho 4):
try {
const val = 'correct value';
(() => {
((arg = val) => {
alert(arg);
})();
})();
} catch (err) {
alert(err.message || 'Unknown error');
}
Bloqueie o escopo em vez da função (snippet 5):
try {
const val = 'correct value';
{
((arg = val) => {
const val = 'ignored value';
alert(arg);
})();
}
} catch (err) {
alert(err.message || 'Unknown error');
}
Baseado no trecho 3, é claro que o val
no arg = val
deve vir do escopo pai, não o escopo da função interior.
No primeiro trecho, o navegador não consegue encontrar val
no escopo atual, mas, em vez de verificar os escopos ancestrais, usa o escopo filho, o que causa a zona morta temporal.
Isso é um bug do iOS ou estou entendendo mal o comportamento adequado do JS?
Esse erro está ocorrendo na saída do Webpack + Babel + Terser, portanto não podemos reescrever o código para evitar esse erro.