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 ve hatta Windows Edge'de "doğru değeri" uyarır. İOS Safari ve iOS Chrome'da "Değişken bulunamıyor: val" uyarısı geliyor.
Aşağıdaki snippet'lerin tümü iOS'ta çalışır:
Varsayılan argüman kullanılmıyor (snippet 2):
try {
const val = 'correct value';
(() => {
alert(val);
(() => {
const val = 'wrong value';
})();
})();
} catch (err) {
alert(err.message || 'Unknown error');
}
Yuvalanmış işlev yok (snippet 3):
try {
const val = 'correct value';
((arg = val) => {
const val = 'ignored value';
alert(val || 'wrong value');
})();
} catch (err) {
alert(err.message || 'Unknown error');
}
Değişkeni geçersiz kılmıyor (snippet 4):
try {
const val = 'correct value';
(() => {
((arg = val) => {
alert(arg);
})();
})();
} catch (err) {
alert(err.message || 'Unknown error');
}
İşlev yerine blok kapsamı (snippet 5):
try {
const val = 'correct value';
{
((arg = val) => {
const val = 'ignored value';
alert(arg);
})();
}
} catch (err) {
alert(err.message || 'Unknown error');
}
Pasajı 3 dayanarak, açıktır val
içinde arg = val
ebeveyn kapsamında, iç fonksiyonun değil kapsamından gelmelidir.
İlk snippet'te tarayıcı val
geçerli kapsamda bulamaz , ancak ataların kapsamlarını kontrol etmek yerine, geçici ölü bölgeye neden olan alt kapsamı kullanır.
Bu bir iOS hatası mı yoksa uygun JS davranışını yanlış mı anlıyorum?
Bu hata Webpack + Babel + Terser çıktımızda meydana geliyor, bu nedenle bu hatayı önlemek için kodu yeniden yazamayız.