try {
const val = 'correct value';
(() => {
((arg = val) => {
const val = 'ignored value';
alert(arg);
})();
})();
} catch (err) {
alert(err.message || 'Unknown error');
}
Su OS X Chrome, OS X Safari, Android Chrome, Windows Chrome, Windows Firefox e persino Windows Edge, avvisa "valore corretto". Su iOS Safari e iOS Chrome, avvisa "Impossibile trovare la variabile: val".
I seguenti frammenti funzionano tutti su iOS:
Non utilizzare l'argomento predefinito (snippet 2):
try {
const val = 'correct value';
(() => {
alert(val);
(() => {
const val = 'wrong value';
})();
})();
} catch (err) {
alert(err.message || 'Unknown error');
}
Nessuna funzione nidificata (snippet 3):
try {
const val = 'correct value';
((arg = val) => {
const val = 'ignored value';
alert(val || 'wrong value');
})();
} catch (err) {
alert(err.message || 'Unknown error');
}
Variabile non prioritaria (snippet 4):
try {
const val = 'correct value';
(() => {
((arg = val) => {
alert(arg);
})();
})();
} catch (err) {
alert(err.message || 'Unknown error');
}
Blocca l'ambito invece della funzione (snippet 5):
try {
const val = 'correct value';
{
((arg = val) => {
const val = 'ignored value';
alert(arg);
})();
}
} catch (err) {
alert(err.message || 'Unknown error');
}
Basato sullo snippet 3, è chiaro che val
in arg = val
dovrebbe provenire dall'ambito padre, non dall'ambito della funzione interna.
Nel primo frammento, il browser non riesce a trovare val
l'ambito corrente, ma invece di verificare gli ambiti dell'antenato, utilizza l'ambito figlio, che causa la zona morta temporale.
È un bug di iOS o sto fraintendendo il comportamento corretto di JS?
Questo errore si verifica nel nostro output Webpack + Babel + Terser, quindi non possiamo semplicemente riscrivere il codice per evitare questo errore.