[javascript] JavaScript가 “;”로 시작해야하는 이유는 무엇입니까?

최근 웹에서 많은 JavaScript 파일 ;이 주석 섹션 바로 뒤에서 시작된다는 것을 알았습니다 .

예를 들어이 jQuery 플러그인 코드는 다음과 같이 시작합니다.

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

파일이 왜 ;? 로 시작해야 합니까? 서버 측 JavaScript 파일 에서도이 규칙을 봅니다.

이 작업의 장점과 단점은 무엇입니까?



답변

스크립트가 종종 연결되고 축소 / 압축 / 전송되므로 마지막 사람이 다음과 같은 것을 가질 가능성이 있습니다.

return {
   'var':'value'
}

마지막 스크립트 ;가 끝날 때 ;처음 시작할 때 안전 하다면 , 예를 들면 다음과 같습니다.

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


답변

나는 이것이 확실하지는 않지만 다른 파일의 이전 진술이 닫히게 할 것이라고 믿습니다. 최악의 경우, 이것은 빈 명령문이지만 가장 좋은 경우에는 완료되지 않은 명령문이 실제로 위에서 올 때이 파일의 오류를 추적하지 않아도됩니다.


답변

이 예제를 고려하십시오.

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

일어날 일은 다음과 같이 평가 될 것입니다.

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

따라서 a돌아 오는 것은 초기화하려고 시도한 함수로 취급됩니다.

이것은 파일을 여러 파일로 연결하려고 할 때 오류를 방지하기위한 것입니다.

a.js

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

b.js

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

이 파일들을 함께 연결하면 문제가 발생합니다.

그러므로 당신 ;앞에 (그리고 아마도 다른 장소 앞에 두는 것을 잊지 마십시오 . Btw. var a = 1;;;var b = 2;;;;;;;;;var c = a+b;완벽하게 유효한 JavaScript입니다


답변