Blok kapsamı olan Javascript varsayılan bağımsız değişkenleri yalnızca iOS'ta başarısız oluyor


9

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 valiçinde arg = valebeveyn kapsamında, iç fonksiyonun değil kapsamından gelmelidir.

İlk snippet'te tarayıcı valgeç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.

Yanıtlar:


3

Bunun, Param varsayılan değerlerinin ve TDZ'lerinin hatalı bir uygulamasının istenmeyen bir sonucu olduğunu düşünüyorum . İOS Safari'nin henüz başlatmadığınız bir şeye atamaya çalıştığınızı düşündüğünden şüpheleniyorum.

Referans için - hatanın yeri:

resim açıklamasını buraya girin


Geçici Çözüm 1 Bir iç kapsam sabitini varsayılan parametreyle ve dış kapsamınkiyle aynı adla başlatma

try {
    const val = 'correct value';
    (() => {
        ((arg = val) => {
            const val_ = 'ignored value';       // <----
            alert(arg);
        })();
    })();
} catch (err) {
    console.error(err);
    console.error('msg', err.message || 'Unknown error');
}

Geçici çözüm 2

Kuvvet constiçin let:

try {
    let val = 'correct value';                 // <----
    (() => {
        ((arg = val) => {
            const val = 'ignored value';
            alert(arg);
        })();
    })();
} catch (err) {
    console.error(err);
    console.error('msg', err.message || 'Unknown error');
}

Geçici Çözüm 3 En const valiçteki kapatma işleminde yeniden başlatma :

try {
    const val = 'correct value';
    (() => {
        ((arg = val) => {
            // const val = 'ignored value';      // <--
            alert(arg);
        })();
    })();
} catch (err) {
    console.error(err);
    console.error('msg', err.message || 'Unknown error');
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.