Saya tertarik jika ada batasan untuk jenis nilai apa yang dapat diatur menggunakan const
JavaScript — dalam fungsi tertentu. Apakah ini valid? Memang itu berhasil, tetapi apakah itu dianggap praktik buruk karena alasan apa pun?
const doSomething = () => {
...
}
Haruskah semua fungsi didefinisikan dengan cara ini di ES6? Sepertinya ini tidak menarik, jika demikian.
Terima kasih atas komentarnya!
javascript
function
const
ecmascript-6
David Sinclair
sumber
sumber
var doSomething = <function def>;
. 4) "Haruskah semua fungsi didefinisikan dengan cara ini di ES6?" Tampaknya merepotkan saya. Saya suka deklarasi fungsi. Semuanya milik mereka sendiri.const
. Apakah Anda ingin mencegah diri Anda menimpa fungsi? Saya berasumsi Anda tahu kode Anda untuk tidak melakukan ini. Apakah Anda ingin menyatakan maksudnyadoSomething
, yaitu bahwa ia memiliki fungsi dan tidak mengubah nilainya? Saya pikir deklarasi fungsi mengkomunikasikan maksud ini dengan jelas juga. Jadi, jika Anda memerlukan "perlindungan runtime" agar tidak menimpa, lakukan saja. Kalau tidak, saya tidak melihat banyak manfaat. Tentu saja jika Anda terutama menggunakanvar foo = function() {};
, saya akan menggunakanconst
sebagai gantinyavar
.const
.Jawaban:
Tidak ada masalah dengan apa yang telah Anda lakukan, tetapi Anda harus ingat perbedaan antara deklarasi fungsi dan ekspresi fungsi.
Deklarasi fungsi, yaitu:
Diangkat sepenuhnya ke bagian atas ruang lingkup (dan suka
let
danconst
mereka juga dicakup blok).Ini berarti bahwa yang berikut ini akan berfungsi:
Ekspresi fungsi, yaitu:
Apakah pembuatan fungsi anonim (
function () {}
) dan pembuatan variabel, dan kemudian penugasan fungsi anonim tersebut ke variabel itu.Jadi aturan yang biasa di sekitar variabel mengangkat dalam lingkup - variabel blok-tertutup (
let
danconst
) tidak mengangkatundefined
ke atas lingkup blok mereka.Ini berarti:
Akan gagal karena
doSomething
tidak ditentukan. (Ini akan melemparReferenceError
)Jika Anda beralih menggunakan
var
Anda mendapatkan pengangkat variabel, tetapi akan diinisialisasiundefined
sehingga blok kode di atas masih tidak akan berfungsi. (Ini akan melemparTypeError
karenadoSomething
bukan fungsi pada saat Anda menyebutnya)Sejauh praktik standar berjalan, Anda harus selalu menggunakan alat yang tepat untuk pekerjaan itu.
Axel Rauschmayer memiliki pos yang bagus tentang ruang lingkup dan mengangkat termasuk es6 semantik: Variabel dan Pelingkupan dalam ES6
sumber
function a(){console.log(this);}
dan bconst a=_=>{console.log(this);}
adalah jika Anda menyebutnya sepertia.call(someVar);
, di a , ia akan mencetaksomeVar
, di b , ia akan mencetakwindow
.Meskipun menggunakan
const
untuk mendefinisikan fungsi tampaknya seperti peretasan, tetapi ia datang dengan beberapa keuntungan besar yang menjadikannya unggul (menurut saya)Itu membuat fungsi tidak berubah, jadi Anda tidak perlu khawatir tentang fungsi yang diubah oleh beberapa bagian kode lainnya.
Anda dapat menggunakan sintaks panah gemuk, yang lebih pendek & bersih.
Menggunakan fungsi panah menjaga
this
ikatan untuk Anda.contoh dengan
function
contoh yang sama dengan
const
sumber
function f(x, y) {
adalah 18 karakter,const f = (x, y) => {
adalah 21 karakter, jadi 3 karakter lebih panjang. 3. Menjaga ikatan ini hanya penting jika fungsi-fungsi didefinisikan di dalam suatu metode (atau fungsi lain yang memiliki makna ini). Pada skrip tingkat atas tidak ada gunanya. Saya tidak mengatakan Anda salah, hanya saja alasan yang Anda sebutkan tidak terlalu relevan.Sudah tiga tahun sejak pertanyaan ini diajukan, tetapi saya baru saja menjumpainya. Karena jawaban ini sangat jauh dari tumpukan, perkenankan saya mengulanginya:
Saya termotivasi untuk melakukan penelitian setelah mengamati seorang pembuat kode JavaScript yang produktif yang selalu menggunakan
const
pernyataanfunctions
, bahkan ketika tidak ada alasan / manfaat yang jelas.Dalam jawaban untuk " apakah ini dianggap praktik buruk karena alasan apa pun? " Saya katakan, IMO, ya itu, atau setidaknya, ada keuntungan menggunakan
function
pernyataan.Menurut saya ini sebagian besar adalah masalah preferensi dan gaya. Ada beberapa argumen bagus yang disajikan di atas, tetapi tidak ada yang begitu jelas seperti yang dilakukan dalam artikel ini:
Konstan kebingungan: mengapa saya masih menggunakan pernyataan fungsi JavaScript oleh medium.freecodecamp.org/Bill Sourour, guru JavaScript, guru, konsultan, dan guru.
Saya mendorong semua orang untuk membaca artikel itu, bahkan jika Anda sudah membuat keputusan.
Inilah poin-poin utamanya:
sumber
defaultErrorHandler
konstinya sendiri yang ditugaskan sebagai fungsi anonim yang kemudian dapat saya panggil dari penangan janji. Ini akan memungkinkan saya untuk secara opsional 'menimpa' penangan kesalahan default ini dalam fungsi seperti yang saya perlukan. Beberapa hanya perlu mengembalikan objek kesalahan dan yang lain perlu mengembalikan respons http, dengan berbagai tingkat verbositas. Namun struktur kode bisa menjadi pola yang sudah dikenal..then( res.success, res.error )
lebih dari fungsi anonim yang saya nyatakan hanya meneleponres.success(value);
. Memiliki.then( ..., defaultErrorHandler)
pola umum bisa menyenangkan, dengan fungsi defaultErrorHandler didefinisikan tingkat atas, dan secara opsionalconst defaultErrorHandler = error => { ... }
mendeklarasikannya dalam lingkup fungsi yang diinginkan.Ada beberapa manfaat yang sangat penting untuk penggunaan
const
dan beberapa akan mengatakan itu harus digunakan sedapat mungkin karena seberapa disengaja dan indikatif itu.Sejauh yang saya tahu, itu adalah deklarasi variabel yang paling indikatif dan dapat diprediksi dalam JavaScript, dan salah satu yang paling berguna, KARENA betapa terhambatnya itu. Mengapa? Karena itu menghilangkan beberapa kemungkinan tersedia untuk
var
danlet
deklarasi.Apa yang dapat Anda simpulkan saat membaca
const
? Anda mengetahui semua hal berikut hanya dengan membacaconst
pernyataan deklarasi, DAN tanpa memindai referensi lain ke variabel itu:Kutipan berikut berasal dari artikel yang mengemukakan manfaat
let
danconst
. Itu juga lebih langsung menjawab pertanyaan Anda tentang batasan / batasan kata kunci:Sumber: https://ponyfoo.com/articles/var-let-const
sumber