Segera sebelum memanggil fungsi dengan nama tertentu, saya ingin mendeklarasikannya (dengan definisi fallback), jika belum ada:

if (typeof myFunction === 'undefined') {
  
  let myFunction = () => console.log('Warning: myFunction() has not been defined.');
}

myFunction();

Tapi, tentu saja, let memiliki cakupan blok, jadi meskipun memberikan myFunction() definisi fallback di dalam if statement, myFunction() tetap tidak terdefinisi di luar if -pernyataan-blok.


Solusi paling sederhana adalah menggunakan var (yang tidak memiliki cakupan blok) alih-alih let:

var myFunction = () => console.log('Warning: myFunction() has not been defined.');

Apakah itu pendekatan yang disarankan? Atau apakah saya melewatkan sesuatu yang lebih konvensional?


NB Bagaimana mungkin saya tidak tahu apakah fungsi khusus ini sudah atau belum didefinisikan (baik dengan let, const atau var)?

Karena saya pasca-pemrosesan skrip yang dibuat pengguna yang mungkin atau mungkin tidak menyertakan definisi fungsi itu dan perlu:

  • memberikan fallback, jika belum ditentukan; atau
  • tidak melakukan apa-apa, jika itu
2
Rounin 7 Januari 2020, 17:11

2 jawaban

Jawaban Terbaik

Gunakan typeof untuk memeriksa apakah variabel telah didefinisikan, yang tidak peduli dengan variabel yang tidak dideklarasikan.

Kemudian, alih-alih mencoba mendeklarasikan variabel dengan nama kustom, cukup deklarasikan variabel baru dengan nama pilihan Anda sendiri yang akan menampung fungsi yang ada atau fungsi fallback, lalu gunakan sendiri variabel untuk panggilan ke fungsi:

{
  const __the_callback = typeof myFunction == "function"
    ? myFunction
    : function fallback() { console.log("warning …"); };

  …
  __the_callback();
}

Pastikan __the_callback tidak bertabrakan dengan nama yang dipilih pengguna.

2
Bergi 7 Januari 2020, 15:05

Menurut saya pendekatan Anda menggunakan var adalah taruhan terbaik Anda dalam situasi yang sangat, sangat spesifik ini:

if (typeof myFunction === 'undefined') {
  
  var myFunction = () => console.log('Warning: myFunction() has not been defined.');
}

myFunction();

Sekali lagi, ini adalah situasi yang sangat spesifik, dan mungkin salah satu dari sedikit kasus penggunaan yang valid untuk var yang tersisa (mungkin yang hanya satu). Tidak ada cara yang dapat diandalkan untuk menggunakan let (atau const, dll.) untuk mendeklarasikan pengikatan (secara longgar, variabel) dalam lingkup ketika Anda tidak tahu apakah atau bagaimana itu sudah didefinisikan.

Satu-satunya solusi semi-layak lainnya adalah dengan hanya menetapkannya, tetapi itu akan spesifik untuk lingkup global, dan akan gagal dalam mode ketat.

var adalah jawabannya di sini saya pikir.

3
T.J. Crowder 7 Januari 2020, 15:01