ทำไมจาวาสคริปต์ต้องเริ่มต้นด้วย“;”


218

ฉันเพิ่งสังเกตเห็นว่าไฟล์ 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( $ ){

ทำไมไฟล์ต้องเริ่มต้นด้วย a ;? ฉันเห็นระเบียบนี้ในไฟล์ JavaScript ฝั่งเซิร์ฟเวอร์เช่นกัน

อะไรคือข้อดีและข้อเสียของการทำเช่นนี้?

คำตอบ:


352

ฉันจะบอกว่าเนื่องจากสคริปต์มักจะมีการตัดแบ่งและย่อขนาด / บีบอัด / ส่งเข้าด้วยกันมีโอกาสที่คนสุดท้ายมีบางอย่างเช่น:

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

8
คุณไม่สามารถมีreturnคำสั่งเป็นสิ่งสุดท้ายในสคริปต์ได้ไหม การกลับมาที่ระดับสูงสุดนั้นไม่สมเหตุสมผล มันต้องเป็นอย่างอื่นใช่มั้ย
user2357112 รองรับ Monica

3
@ user2357112 ยิ่งขึ้นดังนั้นรหัสหลังจากreturnคำสั่งไม่ได้รับการดำเนินการเพื่อให้มันไม่ได้ทำให้ความรู้สึกที่จะ concatenate อย่างน้อยก็มีคน}หาย
Robert

57

ฉันเชื่อว่า (แม้ว่าฉันจะไม่แน่ใจดังนั้นโปรดอย่ากระโจนเข้าใส่ฉัน) เพื่อให้มั่นใจว่าคำสั่งก่อนหน้านี้จากไฟล์อื่นถูกปิด ในกรณีที่เลวร้ายที่สุดนี่จะเป็นข้อความว่างเปล่า แต่ในกรณีที่ดีที่สุดก็สามารถหลีกเลี่ยงการพยายามติดตามข้อผิดพลาดในไฟล์นี้เมื่อคำสั่งที่ยังไม่เสร็จจริงมาจากด้านบน


9
ฉันไม่แน่ใจ 100% แต่ฉันอยู่กับคุณบนนี้ Jerry
okw

12

ลองพิจารณาตัวอย่างนี้:

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;เป็นจาวาสคริปต์ที่ถูกต้องสมบูรณ์แบบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.