Tại sao JavaScript cần bắt đầu với bản;


218

Gần đây tôi đã nhận thấy rằng rất nhiều tệp JavaScript trên Web bắt đầu bằng ;ngay sau phần bình luận.

Ví dụ: mã của plugin jQuery này bắt đầu bằng:

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

Tại sao các tập tin cần phải bắt đầu với một ;? Tôi cũng thấy quy ước này trong các tệp JavaScript phía máy chủ.

Những lợi thế và bất lợi của việc này là gì?

Câu trả lời:


352

Tôi muốn nói vì các kịch bản thường được nối và rút gọn / nén / gửi cùng nhau, có khả năng người cuối cùng có một cái gì đó như:

return {
   'var':'value'
}

ở phần cuối của kịch bản cuối cùng mà không có ;phần cuối. Nếu bạn có một ;khởi đầu của bạn, nó an toàn, ví dụ:

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
Bạn thực sự không thể có một returntuyên bố là điều cuối cùng trong một kịch bản, phải không? Trở lại ở cấp cao nhất không có ý nghĩa. Nó phải là một cái gì đó khác, phải không?
user2357112 hỗ trợ Monica

3
@ user2357112 Thậm chí nhiều hơn như vậy, mã sau khi một returncâu lệnh không được thực thi, do đó, nó không có ý nghĩa để nối. Ít nhất là có một }mất tích.
Robert

57

Tôi tin rằng (mặc dù tôi không chắc chắn, vì vậy xin đừng bỏ qua cho tôi) rằng điều này sẽ đảm bảo mọi tuyên bố trước đó từ một tệp khác được đóng lại. Trong trường hợp xấu nhất, đây sẽ là một tuyên bố trống rỗng, nhưng trong trường hợp tốt nhất, nó có thể tránh việc cố gắng theo dõi một lỗi trong tệp này khi tuyên bố chưa hoàn thành thực sự đến từ phía trên.


9
Tôi không chắc chắn 100% nhưng tôi với bạn về điều này, Jerry.
ok

12

Xem xét ví dụ này:

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

Điều gì sẽ xảy ra là nó sẽ được đánh giá như thế này:

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

Vì vậy, những gì đã atrở lại sẽ được coi là một chức năng mà một cố gắng được khởi tạo.

Điều này chủ yếu là để ngăn ngừa lỗi khi cố gắng ghép các tệp thành một tệp:

a.js

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

b.js

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

Nếu chúng ta ghép các tệp này lại với nhau, nó sẽ gây ra vấn đề.

Vì vậy, hãy nhớ đặt bạn ;ở phía trước (và có thể một vài nơi khác. Btw. var a = 1;;;var b = 2;;;;;;;;;var c = a+b;là JavaScript hoàn toàn hợp lệ

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.