Apa keuntungan dari menetapkan fungsi ke var?

10

Dengan contoh Javascript ini saya temukan

var sum = function() {
  var i, sum = 0;
  for(i = 0; i < arguments.length; i += 1) {
    sum += arguments[i];
  }
  return sum;
};

Apa keuntungan yang ada dalam menetapkan fungsi ke var?

octopusgrabbus
sumber
stackoverflow.com/questions/336859
BlueRaja - Danny Pflughoeft

Jawaban:

8

Jawaban singkat yang saya percaya adalah bahwa Anda sedang membuat fungsi anonim yang ditugaskan ke variabel, sebagai lawan membuat fungsi bernama dengan ...

    function sum() {}

Cara yang baik untuk memeriksa perbedaannya adalah dengan memanggil .ToString () pada mereka dan melihat perbedaannya atau Anda bisa melakukan console.log (sum.name). Satu akan memberikan nama aktual dan yang lainnya tidak ada, yaitu fungsi anonim (yang ditugaskan untuk var). Ada juga spesifik, seperti var sum = function () {} akan didefinisikan pada saat run time dan jumlah fungsi () {} akan didefinisikan pada waktu parse.

harmonickey
sumber
Yang saya maksud dengan kalimat terakhir adalah bahwa jika Anda mencoba memanggil sum () pada baris sebelumnya di atas yang didefinisikan oleh var, maka akan ada kesalahan. Jika didefinisikan seperti dalam jawaban saya maka tidak akan ada kesalahan, bahkan jika panggilan itu di atas fungsi.
harmonickey
12
Itu menjelaskan perbedaannya , tapi saya pikir itu tidak menjelaskan keuntungannya .
Keith Thompson
apa perbedaan antara waktu parse dan runtime?
Wern Ancheta
1
Tidak ada hubungannya dengan fungsi bernama, Anda masih dapat menetapkan fungsi bernama ke variabel
Juan Mendes
5

Salah satu keuntungannya adalah Anda tidak bisa menggunakan deklarasi fungsi di blok. Mereka hanya bisa berada di tingkat atas file atau langsung di dalam fungsi lain.

if (true) {
  function foo() {}
}
try {
  function foo(){}
}
switch (true) {
  default:
    function foo(){}
}

Ini semua tidak ditentukan oleh standar dan browser melakukan hal yang berbeda, lihat /programming/10069204/function-declarations-inside-if-else-statements . Jadi jika Anda harus menggunakan gaya lain kadang-kadang, untuk konsistensi Anda mungkin ingin melakukannya selalu

Juga, saya tidak yakin dengan yang ini tetapi jika saya ingat dengan benar beberapa minifiers lama tidak cukup pintar untuk menangani deklarasi fungsi dan tidak mengganti nama mereka.

Austin
sumber
3

Saya bukan ahli Javascript, jadi ambil ini dengan sebutir garam. Saya pikir dalam beberapa kasus orang mungkin melakukannya untuk gaya dan hal yang sama dapat dicapai hanya dengan menulis "jumlah fungsi () {...}"

Namun, menetapkan fungsi ke variabel adalah teknik yang sangat kuat dalam pemrograman fungsional. Jika Anda terbiasa dengan OOP, ini agak mirip dengan polimorfisme. Pikirkan contoh klasik kelas dasar Hewan dan kelas turunan Kucing / Anjing. Anda bisa menulis kode yang berfungsi dengan Animal tetapi ketika memanggil fungsi, fungsi itu bisa melakukan pekerjaan yang berbeda tergantung pada jenis instance.

Dalam pemrograman fungsional, Anda bisa memiliki algoritma yang bekerja dengan "fungsi" tetapi jika Anda menggunakan variabel untuk memanggil fungsi itu, Anda memiliki fleksibilitas untuk menetapkan fungsi yang berbeda saat runtime.

Misalnya, Anda menulis algoritme untuk menyajikan 10.000 titik data dalam jendela yang hanya berukuran 500 piksel. Setiap piksel kemudian akan mewakili 20 titik data dan untuk menyajikannya, Anda perlu menggabungkan 20 titik data tersebut menjadi satu nilai.

Jadi katakanlah Anda mendefinisikan suatu algoritma untuk menyajikan 10.000 poin dan algoritma ini menggunakan variabel fungsi yang disebut agregat seperti:

...
displayValue = aggregate( numbersInOnePixel );
...

Sekarang saat runtime pengguna Anda dapat memilih bagaimana data akan dikumpulkan. Variabel fungsi aktual Anda dapat berupa salah satu dari yang berikut:

aggregate = function sum() {...}
aggregate = function min() {...}
aggregate = function max() {...}
aggregate = function average() {...}
DXM
sumber
0

Ini sebagian besar masalah gaya, karena satu-satunya situasi di mana perbedaan muncul (memanggil beberapa fungsi sebelum mengakhiri semua deklarasi; menggunakan metode toString) adalah jenis sudut kasus, menurut pendapat saya.

Salah satu argumen yang saya dengar mendukung var =gaya ini adalah bahwa itu konsisten dengan bagaimana Anda mendeklarasikan variabel normal. Ini membatasi jumlah fitur bahasa yang Anda gunakan dan membuatnya lebih mudah untuk memperkenalkan program Anda kepada seseorang yang baru mengenal Javascript.

hugomg
sumber