Semakin banyak saya melihat fungsi yang dideklarasikan seperti
var foo = function() {
// things
};
Alih-alih bagaimana saya telah belajar, seperti
function foo() {
// things
}
Apa bedanya? Performa yang lebih baik? Cakupan? Haruskah saya menggunakan metode ini?
javascript
functions
Steve Robbins
sumber
sumber
Jawaban:
var foo = function() {}
mendefinisikan variabel yang mereferensikan fungsi anonim.function foo() {}
mendefinisikan fungsi bernamafoo
.Entah dapat diluluskan dengan nama sebagai parameter fungsi dan juga dapat dipakai jika penggunaan yang dimaksudkan adalah untuk OOP.
Pada akhirnya, yang Anda gunakan sebagian besar ditentukan oleh kasus penggunaan khusus Anda (Javascript menyenangkan seperti itu;)). Jika Anda akhirnya menggunakan yang pertama, saya sangat menyarankan Anda memberi nama fungsi:
var foo = function MY_function() {}
. Konvensi penamaan ini membantu callstack debugger Anda tidak sia-sia.sumber
foo
dan fungsi disebutMY_function
ekspresi fungsi:
Ekspresi func dalam hal ini adalah anonim tetapi ditugaskan ke var untuk referensi. Ini berbeda dari pernyataan fungsi yang berlabel dengan cara berikut:
new someFunction().constructor.name === 'someFunction';//false
contoh tidak mendapatkan nama var untuk constructor.name karena referensi ke fungsi ditugaskan ke var tetapi var, bukan fungsi, terkait dengan nama varDalam pernyataan fungsi berlabel:
new someFunction().constructor.name === 'someFunction'; //true
nama diikat langsung ke fungsi.Secara umum sebenarnya tidak ada alasan bagus untuk melakukan ekspresi ke var kecuali jika Anda ingin panggilan gagal jika ada yang bergerak atau Anda mendefinisikan / menetapkan metode dalam satu baris. Saya benar-benar menemukan mengangkat berguna untuk mengatur objek dengan func internal dan definisi metode di bagian bawah sehingga saya bisa sampai ke perilaku aktual objek dan melakukan definisi metode publik satu baris (dengan hanya menetapkan funcs
this.
dengan nama yang sama) semuanya dalam satu tempat untuk kemudahan referensi. Anda harus selalu mencoba menggunakan pernyataan berlabel untuk konstruktor, IMO, sehingga Anda dapat mengidentifikasi 'tipe' objek melalui konstruktornya.sumber
Contoh pertama Anda adalah ekspresi sedangkan contoh kedua adalah pernyataan . Mendefinisikan fungsi sebagai ekspresi memungkinkan lebih banyak fleksibilitas di mana definisi dapat terjadi, apa yang dapat Anda tetapkan, bahwa Anda dapat meneruskannya sebagai parameter, dll ...
Sebagai contoh:
vs ...
Contoh yang lebih kompleks akan menjadi sangat rumit tanpa sintaks ekspresi fungsi.
Lihatlah https://stackoverflow.com/questions/111102/how-do-javascript-closures-work
sumber
Perbedaan praktis utama adalah mengangkat. Sebagai contoh:
vs.
Juga, ini adalah perilaku yang tidak terdefinisi
sementara ini ok.
sumber
if
pernyataan!