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
in arg = val
应该来自父作用域,而不是内部函数的作用域。
在第一个代码段中,浏览器无法val
在当前作用域中找到,但是它没有检查祖先作用域,而是使用了子作用域,这会导致时间盲区。
这是iOS的错误还是我误解了正确的JS行为?
此错误发生在我们的Webpack + Babel + Terser输出中,因此我们不能只是重写代码来避免此错误。