!function () {}();
javascript
function
Sebastian Otto
sumber
sumber
Jawaban:
Sintaks JavaScript 101. Ini adalah deklarasi fungsi :
Perhatikan bahwa tidak ada titik koma: ini hanya deklarasi fungsi . Anda perlu doa
foo()
,, untuk benar-benar menjalankan fungsinya.Sekarang, ketika kita menambahkan tanda seru yang tampaknya tidak berbahaya:
!function foo() {}
itu mengubahnya menjadi ekspresi . Sekarang merupakan ekspresi fungsi .Itu
!
saja tidak memanggil fungsi, tentu saja, tetapi kita sekarang dapat menempatkan()
di akhir:!function foo() {}()
yang memiliki prioritas lebih tinggi daripada!
dan langsung memanggil fungsi.Jadi apa yang penulis lakukan adalah menyimpan byte per fungsi ekspresi; cara penulisan yang lebih mudah dibaca adalah:
Terakhir,
!
jadikan ungkapan itu benar. Hal ini karena secara default semua Iife kembaliundefined
, yang meninggalkan kita dengan!undefined
yangtrue
. Tidak terlalu bermanfaat.sumber
!
mengembalikan boolean, kita semua tahu itu, tetapi poin bagus yang Anda buat adalah bahwa ia juga mengubah pernyataan pernyataan fungsi ke ekspresi fungsi sehingga fungsi tersebut dapat langsung dipanggil tanpa membungkusnya dalam tanda kurung. Tidak jelas, dan jelas maksud si pembuat kode.var foo =
memecahkan pernyataan / ekspresi ambiguitas dan Anda cukup menulisvar foo = function(bar){}("baz");
dll.Fungsi:
tidak menghasilkan apa-apa (atau tidak terdefinisi).
Terkadang kita ingin memanggil fungsi dengan benar saat kita membuatnya. Anda mungkin tergoda untuk mencoba ini:
tetapi menghasilkan
SyntaxError
.Menggunakan
!
operator sebelum fungsi menyebabkannya diperlakukan sebagai ekspresi, sehingga kita dapat menyebutnya:Ini juga akan kembali kebalikan boolean dari nilai kembali fungsi, dalam hal ini
true
, karena!undefined
initrue
. Jika Anda ingin nilai pengembalian yang sebenarnya adalah hasil dari panggilan, maka coba lakukan dengan cara ini:sumber
!
adalah untuk mengubah deklarasi fungsi menjadi ekspresi fungsi, itu saja.!function
sintaksAda poin yang baik untuk digunakan
!
untuk pemanggilan fungsi yang ditandai pada panduan JavaScript airbnbSecara umum ide untuk menggunakan teknik ini pada file terpisah (modul alias) yang kemudian digabungkan. Peringatan di sini adalah bahwa file seharusnya disatukan oleh alat yang meletakkan file baru di baris baru (yang merupakan perilaku umum untuk sebagian besar alat concat). Dalam hal itu, menggunakan
!
akan membantu untuk menghindari kesalahan jika modul yang sebelumnya telah dikenali ketinggalan tanda titik koma, dan itu akan memberikan fleksibilitas untuk menempatkannya dalam urutan apa pun tanpa khawatir.Akan bekerja sama dengan
tetapi menyimpan satu karakter dan sewenang-wenang terlihat lebih baik.
Dan omong-omong apapun
+
,-
,~
,void
operator memiliki efek yang sama, dalam hal memohon fungsi, pasti jika Anda harus menggunakan sesuatu untuk kembali dari fungsi mereka akan bertindak berbeda.tetapi jika Anda menggunakan pola IIFE untuk satu file satu pemisahan kode modul dan menggunakan alat concat untuk optimasi (yang membuat satu baris satu pekerjaan file), maka konstruksi
Akan melakukan eksekusi kode aman, sama dengan contoh kode pertama.
Yang ini akan melempar kesalahan karena JavaScript ASI tidak akan dapat melakukan tugasnya.
Satu catatan tentang operator unary, mereka akan melakukan pekerjaan yang sama, tetapi hanya dalam kasus, mereka tidak menggunakan modul pertama. Jadi mereka tidak begitu aman jika Anda tidak memiliki kendali penuh atas urutan penyatuan.
Ini bekerja:
Ini bukan:
sumber
Ini mengembalikan apakah pernyataan dapat mengevaluasi ke false. misalnya:
Anda dapat menggunakannya dua kali untuk memaksa nilai ke boolean:
Jadi, untuk lebih langsung menjawab pertanyaan Anda:
Sunting: Ini memiliki efek samping dari mengubah deklarasi fungsi ke ekspresi fungsi. Misalnya kode berikut ini tidak valid karena ditafsirkan sebagai deklarasi fungsi yang tidak memiliki pengidentifikasi yang diperlukan (atau nama fungsi ):
sumber
var myVar = !function(){ return false; }()
bisa menghilangkan!
sejenisnyavar myVar = function(){ return false; }()
dan fungsi akan mengeksekusi dengan benar dan nilai kembali akan tersentuh.true
dengan!0
danfalse
dengan!1
. Ini menghemat 2 atau 3 karakter.Hanya untuk menyimpan satu byte data saat kita melakukan minavascript.
pertimbangkan fungsi anonim di bawah ini
Untuk menjadikan di atas sebagai fungsi pemanggilan mandiri, kami biasanya akan mengubah kode di atas sebagai
Sekarang kami menambahkan dua karakter tambahan
(,)
selain menambahkan()
di akhir fungsi yang diperlukan untuk memanggil fungsi. Dalam proses minifikasi biasanya kita fokus untuk mengurangi ukuran file. Jadi kita juga bisa menulis fungsi di atas sebagaiMasih keduanya adalah fungsi yang dapat dipanggil sendiri dan kami menyimpan byte juga. Alih-alih 2 karakter,
(,)
kami hanya menggunakan satu karakter!
sumber
! adalah operator TIDAK logis , itu adalah operator boolean yang akan membalikkan sesuatu yang berlawanan.
Meskipun Anda dapat mem-bypass kurung dari fungsi yang dipanggil dengan menggunakan BANG (!) Sebelum fungsi, itu masih akan membalikkan pengembalian, yang mungkin bukan apa yang Anda inginkan. Seperti dalam kasus IEFE, itu akan kembali tidak terdefinisi , yang ketika dibalik menjadi boolean benar.
sumber
Tanda seru membuat fungsi apa pun selalu mengembalikan boolean.
Nilai akhir adalah negasi dari nilai yang dikembalikan oleh fungsi.
Menghilangkan
!
contoh-contoh di atas akan menjadi Sintaksis .Namun, cara yang lebih baik untuk mencapai ini adalah:
sumber
!
mengubah cara runtime mem-parsing fungsi. Itu membuat runtime memperlakukan fungsi sebagai ekspresi fungsi (dan bukan deklarasi). Ini melakukan ini untuk memungkinkan pengembang untuk segera memanggil fungsi menggunakan()
sintaks.!
juga akan berlaku sendiri (yaitu negasi) pada hasil memohon ekspresi fungsi.Ini cara lain untuk menulis IIFE (ekspresi fungsi yang segera dipanggil).
Cara penulisan lainnya -
sama dengan
sumber
(function (args) {...})()
sintaksis yang lebih eksplisit dan meninggalkan!function
formulir itu ke alat minifikasi dan kebingungan.!
akan meniadakan (berlawanan) apapun yang Anda harapkan sebagai hasilnya, yaitu jika Anda milikiketika Anda menelepon
boy
, hasilnya Anda akantrue
, tetapi saat Anda menambahkan!
saat meneleponboy
, yaitu!boy
, hasil Anda akanfalse
. Yang dengan kata lain maksud Anda NotBoy , tapi kali ini pada dasarnya merupakan hasil boolean, baiktrue
ataufalse
.Itu adalah hal yang sama yang terjadi pada
!function () {}();
ekspresi, menjalankan hanyafunction () {}();
akan menandai Anda kesalahan, tetapi menambahkan!
tepat di depanfunction () {}();
ekspresi Anda , membuatnya menjadi kebalikan darifunction () {}();
yang seharusnya mengembalikan Andatrue
. Contohnya bisa dilihat di bawah ini:sumber