มันไม่ทำงานเพราะมันจะถูกแยกวิเคราะห์เป็นFunctionDeclarationและระบุชื่อของการประกาศฟังก์ชั่นเป็นผู้ได้รับมอบอำนาจ
เมื่อคุณล้อมรอบด้วยวงเล็บจะถูกประเมินเป็น a FunctionExpressionและนิพจน์ฟังก์ชันสามารถตั้งชื่อได้หรือไม่
ไวยากรณ์ของFunctionDeclarationหน้าตาแบบนี้:
function Identifier ( FormalParameterListopt ) { FunctionBody }
และFunctionExpressions:
function Identifieropt ( FormalParameterListopt ) { FunctionBody }
ตามที่คุณเห็นโทเค็นIdentifier(ตัวระบุการเลือก ) FunctionExpressionเป็นทางเลือกดังนั้นเราสามารถมีนิพจน์ฟังก์ชันโดยไม่มีชื่อที่กำหนดไว้:
(function () {
alert(2 + 2);
}());
หรือชื่อฟังก์ชั่นการแสดงออก:
(function foo() {
alert(2 + 2);
}());
วงเล็บ (เรียกอย่างเป็นทางการว่าGrouping Operator ) สามารถล้อมรอบนิพจน์เท่านั้นและนิพจน์ฟังก์ชันจะถูกประเมิน
การผลิตไวยากรณ์ทั้งสองนั้นอาจคลุมเครือและอาจมีลักษณะเหมือนกันทุกประการเช่น:
function foo () {} // FunctionDeclaration
0,function foo () {} // FunctionExpression
ตัวแยกวิเคราะห์รู้ว่าเป็นFunctionDeclarationหรือFunctionExpressionขึ้นอยู่กับบริบทที่ปรากฏ
ในตัวอย่างข้างต้นตัวที่สองคือนิพจน์เนื่องจากตัวดำเนินการ Commaสามารถจัดการนิพจน์ได้เท่านั้น
ในทางกลับกันFunctionDeclarations สามารถปรากฏขึ้นได้ในสิ่งที่เรียกว่าProgramรหัส "" เท่านั้นความหมายของรหัสที่อยู่นอกขอบเขตทั่วโลกและภายในFunctionBodyฟังก์ชันอื่น ๆ
ควรหลีกเลี่ยงการใช้งานฟังก์ชั่นภายในบล็อคเพราะสามารถนำไปสู่พฤติกรรมที่คาดเดาไม่ได้เช่น:
if (true) {
function foo() {
alert('true');
}
} else {
function foo() {
alert('false!');
}
}
foo(); // true? false? why?
รหัสข้างต้นจริงควรผลิตSyntaxErrorตั้งแต่Blockเท่านั้นที่สามารถมีงบ (และ ECMAScript จำเพาะไม่ได้กำหนดคำสั่งฟังก์ชั่นใด ๆ ) 'false!'แต่การใช้งานส่วนใหญ่มีความอดทนและก็จะใช้ฟังก์ชั่นที่สองหนึ่งซึ่งการแจ้งเตือน
การใช้งาน Mozilla -Rhino, SpiderMonkey - มีพฤติกรรมที่แตกต่าง ไวยากรณ์ของพวกเขามีคำสั่งฟังก์ชั่นที่ไม่ได้มาตรฐานซึ่งหมายความว่าฟังก์ชั่นจะได้รับการประเมินในเวลาทำงานไม่ใช่เวลาในการแยกวิเคราะห์ตามที่เกิดขึ้นกับFunctionDeclarations ในการใช้งานเหล่านั้นเราจะได้รับฟังก์ชั่นแรกที่กำหนดไว้
ฟังก์ชั่นสามารถประกาศได้หลายวิธีเปรียบเทียบสิ่งต่อไปนี้ :
1- ฟังก์ชั่นที่กำหนดด้วยฟังก์ชั่นคอนสตรัคที่กำหนดให้กับตัวแปรคูณ :
var multiply = new Function("x", "y", "return x * y;");
2- การประกาศฟังก์ชันของฟังก์ชันที่ชื่อทวีคูณ :
function multiply(x, y) {
return x * y;
}
3- การแสดงออกของฟังก์ชั่นที่กำหนดให้กับตัวแปรคูณ :
var multiply = function (x, y) {
return x * y;
};
4- ชื่อฟังก์ชั่นการแสดงออกfunc_name ที่กำหนดให้กับตัวแปรคูณ :
var multiply = function func_name(x, y) {
return x * y;
};