Neden JavaScript'in “;” ile başlaması gerekiyor?


218

Kısa bir süre önce Web'deki birçok JavaScript dosyasının ;yorum bölümünü hemen takip ederek başladığını fark ettim .

Örneğin, bu jQuery eklentisinin kodu şununla başlar:

/**
 * 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( $ ){

Dosyanın neden bir ile başlaması gerekiyor ;? Bu kuralı sunucu tarafı JavaScript dosyalarında da görüyorum.

Bunu yapmanın avantajları ve dezavantajları nelerdir?

Yanıtlar:


352

Komut dosyaları genellikle birleştirilmiş ve küçültülmüş / sıkıştırılmış / birlikte gönderildiği için, son adamın böyle bir şeye sahip olma şansı olduğunu söyleyebilirim:

return {
   'var':'value'
}

son komut dosyasının ;sonunda bir son olmadan . ;Başlangıçta kendiniz bir a varsa , güvenli, örnek:

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
Aslında bir olamaz returnyapabilirsiniz, bir komut son şey olarak açıklama? Üst seviyeye dönmek mantıklı değil. Başka bir şey olmalı, değil mi?
user2357112,

3
@ user2357112 Hatta daha fazlası, kod sonra bir returno BİRLEŞTİR mantıklı değil bu yüzden açıklamada, yürütülen almaz. En azından bir }eksik var.
Robert

57

Emin değilim (emin değilim, bu yüzden lütfen bana saldırmayın) bu farklı bir dosyadan önceki herhangi bir ifadenin kapalı olmasını sağlayacaktır. En kötü durumda, bu boş bir ifade olurdu, ancak en iyi durumda, tamamlanmamış ifade aslında yukarıdan geldiğinde bu dosyadaki bir hatayı izlemeye çalışmaktan kaçınabilir.


9
% 100 emin değilim ama bu konuda seninleyim Jerry.
okw

12

Bu örneği düşünün:

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

Ne olacağı şu şekilde değerlendirilecek:

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

Yani ageri dönen şey başlatılmaya çalışılan bir işlev olarak kabul edilecektir.

Bu çoğunlukla dosyaları tek bir dosyada birleştirmeye çalışırken hataları önlemektir:

a.js

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

b.js

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

Bu dosyaları bir araya getirirsek sorunlara neden olur.

Bu nedenle ;, önünüzde (ve belki de birkaç başka yerin önüne koymayı unutmayın . Btw. var a = 1;;;var b = 2;;;;;;;;;var c = a+b;tamamen geçerli bir JavaScript

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.