try {
const val = 'correct value';
(() => {
((arg = val) => {
const val = 'ignored value';
alert(arg);
})();
})();
} catch (err) {
alert(err.message || 'Unknown error');
}
Trên OS X Chrome, OS X Safari, Android Chrome, Windows Chrome, Windows Firefox và thậm chí Windows Edge, nó cảnh báo "giá trị chính xác". Trên iOS Safari và iOS Chrome, nó thông báo "Không thể tìm thấy biến: val".
Các đoạn mã sau đây đều hoạt động trên iOS:
Không sử dụng đối số mặc định (đoạn 2):
try {
const val = 'correct value';
(() => {
alert(val);
(() => {
const val = 'wrong value';
})();
})();
} catch (err) {
alert(err.message || 'Unknown error');
}
Không có chức năng lồng nhau (đoạn 3):
try {
const val = 'correct value';
((arg = val) => {
const val = 'ignored value';
alert(val || 'wrong value');
})();
} catch (err) {
alert(err.message || 'Unknown error');
}
Không ghi đè biến (đoạn 4):
try {
const val = 'correct value';
(() => {
((arg = val) => {
alert(arg);
})();
})();
} catch (err) {
alert(err.message || 'Unknown error');
}
Chặn phạm vi thay vì chức năng (đoạn 5):
try {
const val = 'correct value';
{
((arg = val) => {
const val = 'ignored value';
alert(arg);
})();
}
} catch (err) {
alert(err.message || 'Unknown error');
}
Dựa trên đoạn 3, rõ ràng rằng phần val
vào arg = val
phải xuất phát từ phạm vi cha, không phải phạm vi của hàm bên trong.
Trong đoạn mã đầu tiên, trình duyệt không thể tìm thấy val
trong phạm vi hiện tại, nhưng thay vì kiểm tra phạm vi tổ tiên, nó sử dụng phạm vi con, gây ra vùng chết tạm thời.
Đây có phải là lỗi của iOS hay tôi hiểu nhầm hành vi JS thích hợp?
Lỗi này xảy ra trong đầu ra Webpack + Babel + Terser của chúng tôi, vì vậy chúng tôi không thể viết lại mã để tránh lỗi này.