เหตุใดฉันจึงควรใช้เครื่องหมายอัฒภาคหลังจากทุกฟังก์ชันใน javascript


282

ฉันเคยเห็นนักพัฒนาที่แตกต่างกันรวมถึงอัฒภาคหลังจากฟังก์ชั่นใน javascript และบางคนไม่ได้ แนวปฏิบัติที่ดีที่สุดคืออะไร

function weLikeSemiColons(arg) {
   // bunch of code
};

หรือ

function unnecessary(arg) {
  // bunch of code
}

คำตอบ:


424

อัฒภาคหลังจากการประกาศฟังก์ชั่นมีไม่จำเป็น

ไวยากรณ์ของ a FunctionDeclarationถูกอธิบายไว้ในข้อกำหนดดังต่อไปนี้:

function Identifier ( FormalParameterListopt ) { FunctionBody }

ไม่จำเป็นต้องใช้เครื่องหมายอัฒภาค แต่อาจสงสัยว่าทำไม

อัฒภาคทำหน้าที่ในการแยกจากกันงบจากแต่ละอื่น ๆ และFunctionDeclarationไม่ได้เป็นคำสั่ง

FunctionDeclarationsได้รับการประเมินก่อนที่รหัสจะเข้าสู่การดำเนินการการยกเป็นคำทั่วไปที่ใช้เพื่ออธิบายพฤติกรรมนี้

คำว่า "การประกาศฟังก์ชั่น" และ "คำสั่งฟังก์ชั่น" มักจะใช้แทนกันอย่างไม่ถูกต้องเพราะไม่มีคำสั่งฟังก์ชั่นที่อธิบายไว้ในข้อมูลจำเพาะ ECMAScript อย่างไรก็ตามมีการใช้งานบางอย่างที่มีคำสั่งฟังก์ชั่นในไวยากรณ์ของพวกเขา ไม่ได้มาตรฐาน

อย่างไรก็ตามควรใช้เครื่องหมายอัฒภาคในตำแหน่งที่คุณใช้FunctionExpressionsเสมอเช่น

var myFn = function () {
  //...
};

(function () {
  //...
})();

หากคุณเว้นเครื่องหมายอัฒภาคหลังจากฟังก์ชันแรกในตัวอย่างข้างต้นคุณจะได้รับผลลัพธ์ที่ไม่พึงประสงค์อย่างสมบูรณ์:

var myFn = function () {
  alert("Surprise!");
} // <-- No semicolon!

(function () {
  //...
})();

ฟังก์ชั่นแรกจะถูกดำเนินการทันทีเนื่องจากวงเล็บที่ล้อมรอบที่สองจะถูกตีความว่าArgumentsเป็นการเรียกใช้ฟังก์ชัน

การบรรยายที่แนะนำ:


2
แก้ไขเพื่อชี้แจงบทความที่พูดถึงการแสดงออกของฟังก์ชั่น
CMS

1
ไม่คุ้นเคยกับ ECMA ทั้งหมด แต่นั่นเป็นมาตรฐานที่ฉันใช้เช่นกัน โพสต์ที่ดี ส่วนใหญ่ฉันเห็นออนไลน์และตัวอย่างรหัสที่ DL ใช้มาตรฐานนั้นดังนั้นฉันเพิ่งปรับมัน
regex

1
ความสับสนบางอย่างที่นี่อาจได้รับอิทธิพลจากการขาดคำภาษาอังกฤษที่ดีสำหรับ "ได้รับอนุญาตเพราะจะถูกละเว้น" เราถอยกลับไปพูดว่า "ตัวเลือก" แต่นั่นก็ทำให้เข้าใจผิดเพราะมันแสดงให้เห็นว่าไม่รวมอัฒภาคหลังจากการประกาศตกอยู่ในหมวดหมู่เดียวกันไม่รวมอัฒภาคหลังจากคำสั่ง หลังเป็นตัวเลือกในการให้ความรู้สึกที่แตกต่างกันโดยสิ้นเชิงนั่นก็เป็นเพราะตัวแยกวิเคราะห์ที่จะเพิ่มหายไปอัฒภาคคุณมองข้ามในขณะที่ในกรณีนี้มันเป็นเพราะตัวแยกวิเคราะห์ที่จะละเว้นอัฒภาคคุณรวม ที่จะนำมันวิธีอื่น: ถ้าใครเป็นตัวเลือกเพื่อให้มีแปด
Semicolon

ลิงก์ "ชื่อฟังก์ชันที่แสดงออกถึง demystified" ลิงก์ไปยัง URL ที่ตายแล้วตอนนี้ที่เก็บถาวรของเว็บมีสำเนาที่นี่: web.archive.org/web/20100426173335/http://yura.thinkweb2.com/ …
Tony

ตัวอย่างสุดท้ายคือตัวอย่างที่ยอดเยี่ยม การเว้นเครื่องหมายอัฒภาคในกรณีนี้จะนำไปสู่ข้อบกพร่องที่แปลกและยากต่อการแก้ไข สุดยอดการโหวต
Yan Yankowski

38

ฉันใช้พวกเขาหลังจากประกาศฟังก์ชั่นตามตัวแปร:

var f = function() { ... };

แต่ไม่ใช่หลังจากคำจำกัดความสไตล์คลาสสิก:

function f() {
    ...
}

NetBeans และ IDE อื่น ๆ ต้องการเห็นเซมิโคลอนหลังฟังก์ชัน -as-variable เช่น this.animaton_fun = function () {... };
Lance Cleveland

6
แต่ - สำหรับถาม - ทำไม ?
ลุค

มันช่วยในระหว่างขั้นตอนการสร้าง เมื่อสคริปต์ uglifier เห็นเครื่องหมายอัฒภาคก็ไม่จำเป็นต้องเพิ่มตัวแบ่งบรรทัดลงในไฟล์เอาต์พุตหากไม่พบตัวแบ่งบรรทัดจะถูกสร้างขึ้นและไฟล์จะใหญ่ขึ้นเล็กน้อย
autoboxer

20

JS Lintเป็นแบบแผนโดยพฤตินัยและมันบอกว่าไม่มีเครื่องหมายอัฒภาคหลังจากฟังก์ชันเนื้อหา ดู"อัฒภาค"ส่วน


10
ฉันได้เห็นฟังก์ชั่นมือแรกที่ล้มเหลวเพราะขาดเซมิโคลอน ฉันไม่เห็นด้วยอย่างยิ่งว่าการปล่อยให้เป็นแบบแผน ในขณะที่ 99.99% ของเวลาจะไม่แตก แต่ก็มีบางสถานการณ์ที่ฉันสังเกตเห็นว่า IE ไม่สามารถแทรกซึม JavaScript ได้โดยไม่ต้องใช้เครื่องหมายอัฒภาค
MillsJROSS

8
การตอบสนองของฉันเกี่ยวข้องเฉพาะกับคำจำกัดความของฟังก์ชันเช่นในสองตัวอย่างของคำถาม ในกรณีเหล่านี้อัฒภาคยุติไม่จำเป็นต้องใช้ในการใด ๆ ที่เบราว์เซอร์ในใด ๆสถานการณ์ ฉันเดาว่าคุณอาจนึกถึงการแสดงออกของฟังก์ชั่น มันเป็นเรื่องที่แตกต่างอย่างสิ้นเชิงและไม่ใช่คำถามที่ถูกกล่าวถึงในคำถามเดิม
David Hedlund

var myFunction = ฟังก์ชั่น (หาเรื่อง) {console.log (หาเรื่อง); } (function () {console.log ('ฟังก์ชั่นที่ไม่เกี่ยวข้องอย่างสมบูรณ์'); return 'ดูว่าเกิดอะไรขึ้น';} ());
Maciej Krawczyk

@MillsJROSS ฉันตอบสนองของเดวิดเป็นครั้งที่สองและจะมีความสุขถ้าคุณอธิบายความล้มเหลวที่คุณเจอ เป็นหน้าที่ของ IE หรือเปล่า?
wlnirvana

7

อยู่อย่างสม่ำเสมอ! พวกเขาไม่จำเป็น แต่ฉันใช้พวกเขาเป็นการส่วนตัวเพราะเทคนิคการแบ่งย่อยส่วนใหญ่ขึ้นอยู่กับเซมิโคลอน (ตัวอย่างเช่นPacker )


5

ขึ้นอยู่กับความชอบของคุณ ฉันชอบที่จะวางบรรทัดของโค้ดด้วย semi colons เพราะฉันคุ้นเคยกับ Java, C ++, C # ฯลฯ ดังนั้นฉันจึงใช้มาตรฐานเดียวกันสำหรับการเข้ารหัสใน javascript

โดยทั่วไปแล้วฉันไม่ได้จบฟังก์ชั่นการประกาศในกึ่งทวิภาคแม้ว่า แต่นั่นเป็นเพียงการตั้งค่าของฉัน

เบราว์เซอร์จะทำงานด้วยวิธีใดวิธีหนึ่ง แต่บางทีสักวันหนึ่งพวกเขาอาจจะเกิดขึ้นพร้อมกับมาตรฐานที่เข้มงวดซึ่งควบคุมเรื่องนี้

ตัวอย่างของรหัสที่ฉันจะเขียน:

function handleClickEvent(e)
{
     // comment
     var something = true;  // line of code
     if (something)  // code block
     {
        doSomething();  // function call
     }
}

1
เส้นควรถูกยกเลิกด้วยเครื่องหมายอัฒภาคอย่างแน่นอน มิฉะนั้นตัวลดขนาดอาจทำให้ฟังก์ชั่นการทำงานผิดพลาดไปโดยสิ้นเชิง
David Hedlund

9
@david: ในกรณีนี้ minifier เสียใช่ไหม
DisgruntledGoat

ตกลง มันเป็นวิธีการเข้ารหัสที่เป็นธรรมชาติสำหรับคน (เช่นฉัน) ที่มาจากภูมิหลังของ C / C ++ นอกจากนี้ยังทำให้โค้ดอ่านง่ายขึ้น
Anshuman Manral

3

มันเป็นมากกว่าแค่เรื่องของการประชุมหรือความมั่นคง

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

นอกจากนี้เมื่อคุณบีบอัดหรือลดขนาดโค้ดการขาดเซมิโคลอนอาจทำให้สคริปต์ของคุณย่อเล็กลงซึ่งไม่ได้ทำสิ่งที่คุณต้องการเพราะพื้นที่สีขาวทั้งหมดหายไป


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

1
เห็นด้วยและไม่สามารถใส่เครื่องหมายอัฒภาคหลังจากฟังก์ชันจะทำให้เกิดปัญหาการลดขนาดที่ฉันกล่าวถึง ขอให้โชคดี
Mason

สาเหตุการยกระดับการตอกย้ำประเด็นการลดความชัดเจนของความเข้าใจของฉัน
JackW327

1

เมื่อฉันย่อสคริปต์ของฉันฉันรู้ว่าฉันต้องใช้เครื่องหมายอัฒภาคสำหรับฟังก์ชันที่เริ่มต้นด้วยเครื่องหมายเท่ากับ หากคุณกำหนดฟังก์ชันเป็น var คุณต้องใช้เครื่องหมายอัฒภาค

ต้องการเครื่องหมายอัฒภาค

var x = function(){};
var x = new function(){};
this.x = function(){};

ไม่จำเป็นต้องใช้เครื่องหมายอัฒภาค

function x(){}

0

SIMPLE:

เป็นวิธีปฏิบัติที่ดีที่จะทิ้งเครื่องหมายอัฒภาคไว้;หลังจากสิ้นสุดฟังก์ชั่นเครื่องมือจัดฟัน พวกเขาได้รับการพิจารณาว่าเป็นแนวปฏิบัติที่ดีที่สุดมานานหลายปี

ข้อดีอย่างหนึ่งของการใช้งานอยู่ตลอดเวลาคือถ้าคุณต้องการลดขนาด JavaScript ของคุณ

ในการลดขนาดจาวาสคริปต์จะช่วยลดขนาดไฟล์ลงได้เล็กน้อย

แต่สำหรับแนวทางปฏิบัติที่ดีที่สุดและคำตอบข้างต้นไม่แนะนำให้ใช้หลังจากแท็กฟังก์ชั่น

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


0

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

//file one
var one=1;
var two=2;
function tryOne(){}
function trytwo(){}

และ

//file two
var one=1;
var two=2;
function tryOne(){};
function trytwo(){};

เมื่อคุณย่อขนาดทั้งสองคุณจะได้รับสิ่งต่อไปนี้เป็นเอาต์พุต

โปรดทราบว่าความคิดเห็นเป็นเพียงเพื่อความไม่พอใจ

//file one
var one=1;var two=2;function tryOne(){}
function trytwo(){}

และ

//file two
var one=1;var two=2;function tryOne(){};function trytwo(){};
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.