try {
const val = 'correct value';
(() => {
((arg = val) => {
const val = 'ignored value';
alert(arg);
})();
})();
} catch (err) {
alert(err.message || 'Unknown error');
}
En OS X Chrome, OS X Safari, Android Chrome, Windows Chrome, Windows Firefox e incluso Windows Edge, alerta "valor correcto". En iOS Safari y iOS Chrome, alerta "No se puede encontrar la variable: val".
Los siguientes fragmentos funcionan en iOS:
No se usa el argumento predeterminado (fragmento 2):
try {
const val = 'correct value';
(() => {
alert(val);
(() => {
const val = 'wrong value';
})();
})();
} catch (err) {
alert(err.message || 'Unknown error');
}
Sin funciones anidadas (fragmento 3):
try {
const val = 'correct value';
((arg = val) => {
const val = 'ignored value';
alert(val || 'wrong value');
})();
} catch (err) {
alert(err.message || 'Unknown error');
}
No sobrescribe la variable (fragmento 4):
try {
const val = 'correct value';
(() => {
((arg = val) => {
alert(arg);
})();
})();
} catch (err) {
alert(err.message || 'Unknown error');
}
Bloquee el alcance en lugar de la función (fragmento 5):
try {
const val = 'correct value';
{
((arg = val) => {
const val = 'ignored value';
alert(arg);
})();
}
} catch (err) {
alert(err.message || 'Unknown error');
}
Basado en el fragmento 3, está claro que el val
de arg = val
debe venir del ámbito padre, no el alcance de la función interna.
En el primer fragmento, el navegador no puede encontrar val
en el ámbito actual, pero en lugar de verificar los ámbitos ancestrales, utiliza el ámbito secundario, que causa la zona muerta temporal.
¿Es esto un error de iOS o estoy malinterpretando el comportamiento correcto de JS?
Este error está ocurriendo en nuestra salida Webpack + Babel + Terser, por lo que no podemos simplemente reescribir el código para evitar este error.