Mengapa JavaScript harus dimulai dengan “;”?


218

Saya baru-baru ini memperhatikan bahwa banyak file JavaScript di Web mulai dengan ;segera mengikuti bagian komentar.

Misalnya, kode plugin jQuery ini dimulai dengan:

/**
 * jQuery.ScrollTo
 * Copyright (c) 2007-2008 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com
 * Dual licensed under MIT and GPL.
 * Date: 9/11/2008                                      
 .... skipping several lines for brevity...
 *
 * @desc Scroll on both axes, to different values
 * @example $('div').scrollTo( { top: 300, left:'+=200' }, { axis:'xy', offset:-20 } );
 */
;(function( $ ){

Mengapa file harus dimulai dengan ;? Saya melihat konvensi ini di file JavaScript sisi-server juga.

Apa kelebihan dan kekurangan dari melakukan ini?

Jawaban:


352

Saya akan mengatakan karena skrip sering disatukan dan diperkecil / dikompresi / dikirim bersama-sama ada kemungkinan orang terakhir memiliki sesuatu seperti:

return {
   'var':'value'
}

di akhir skrip terakhir tanpa ;di akhir. Jika Anda memiliki ;di awal milik Anda, itu aman, contoh:

return {
   'var':'value'
}
;(function( $ ){ //Safe (still, screw you, last guy!)

return {
   'var':'value'
}
(function( $ ){ //Oh crap, closure open, kaboom!

return {
   'var':'value'
};
;(function( $ ){ //Extra ;, still safe, no harm

8
Anda sebenarnya tidak dapat memiliki returnpernyataan sebagai hal terakhir dalam sebuah skrip, bukan? Kembali di tingkat atas tidak masuk akal. Itu harus menjadi sesuatu yang lain, bukan?
user2357112 mendukung Monica

3
@ user2357112 Bahkan lebih lagi, kode setelah sebuah returnpernyataan tidak dijalankan, sehingga tidak masuk akal untuk concatenate. Setidaknya ada yang }hilang.
Robert

57

Saya percaya (meskipun saya tidak yakin, jadi tolong jangan menerkam saya) bahwa ini akan memastikan pernyataan sebelumnya dari file yang berbeda ditutup. Dalam kasus terburuk, ini akan menjadi pernyataan kosong, tetapi dalam kasus terbaik itu bisa menghindari mencoba melacak kesalahan dalam file ini ketika pernyataan yang belum selesai benar-benar datang dari atas.


9
Saya tidak 100% yakin tapi saya dengan Anda dalam hal ini, Jerry.
okw

12

Pertimbangkan contoh ini:

function a() {
  /* this is my function a */
}
a()
(function() {
  /* This is my closure */
})()

Apa yang akan terjadi adalah itu akan dievaluasi seperti ini:

function a() {
  /* this is my function a */
}
a()(function() {})()

Terserah a yang kembali akan diperlakukan sebagai fungsi yang dicoba diinisialisasi.

Ini sebagian besar untuk mencegah kesalahan ketika mencoba menggabungkan file multiply menjadi satu file:

a.js

function a() {
  /* this is my function a */
}
a()

b.js

(function() {
  /* This is my closure */
})()

Jika kita menyatukan file-file ini bersama-sama itu akan menyebabkan masalah.

Jadi karena itu ingatlah untuk menempatkan Anda ;di depan (dan mungkin juga beberapa tempat lain. Btw. var a = 1;;;var b = 2;;;;;;;;;var c = a+b;adalah JavaScript yang benar-benar valid

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.