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?

TK.
sumber

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
Nick Craver
sumber
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.

Jerry Bullard
sumber
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

andlrc
sumber