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
เข้าarg = val
ควรมาจากขอบเขตหลักไม่ใช่ขอบเขตของฟังก์ชันภายใน
ในตัวอย่างแรกเบราว์เซอร์ไม่สามารถหาได้val
ในขอบเขตปัจจุบัน แต่แทนที่จะตรวจสอบขอบเขตบรรพบุรุษนั้นจะใช้ขอบเขตลูกซึ่งทำให้โซนตายชั่วคราว
นี่เป็นข้อบกพร่องของ iOS หรือฉันเข้าใจผิดว่าพฤติกรรมของ JS เหมาะสมหรือไม่
ข้อผิดพลาดนี้เกิดขึ้นในผลลัพธ์ Webpack + Babel + Terser ของเราดังนั้นเราจึงไม่สามารถเขียนรหัสซ้ำเพื่อหลีกเลี่ยงข้อบกพร่องนี้