มันไม่ทำงานเพราะมันจะถูกแยกวิเคราะห์เป็นFunctionDeclaration
และระบุชื่อของการประกาศฟังก์ชั่นเป็นผู้ได้รับมอบอำนาจ
เมื่อคุณล้อมรอบด้วยวงเล็บจะถูกประเมินเป็น a FunctionExpression
และนิพจน์ฟังก์ชันสามารถตั้งชื่อได้หรือไม่
ไวยากรณ์ของFunctionDeclaration
หน้าตาแบบนี้:
function Identifier ( FormalParameterListopt ) { FunctionBody }
และFunctionExpression
s:
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สามารถจัดการนิพจน์ได้เท่านั้น
ในทางกลับกันFunctionDeclaration
s สามารถปรากฏขึ้นได้ในสิ่งที่เรียกว่าProgram
รหัส "" เท่านั้นความหมายของรหัสที่อยู่นอกขอบเขตทั่วโลกและภายในFunctionBody
ฟังก์ชันอื่น ๆ
ควรหลีกเลี่ยงการใช้งานฟังก์ชั่นภายในบล็อคเพราะสามารถนำไปสู่พฤติกรรมที่คาดเดาไม่ได้เช่น:
if (true) {
function foo() {
alert('true');
}
} else {
function foo() {
alert('false!');
}
}
foo(); // true? false? why?
รหัสข้างต้นจริงควรผลิตSyntaxError
ตั้งแต่Block
เท่านั้นที่สามารถมีงบ (และ ECMAScript จำเพาะไม่ได้กำหนดคำสั่งฟังก์ชั่นใด ๆ ) 'false!'
แต่การใช้งานส่วนใหญ่มีความอดทนและก็จะใช้ฟังก์ชั่นที่สองหนึ่งซึ่งการแจ้งเตือน
การใช้งาน Mozilla -Rhino, SpiderMonkey - มีพฤติกรรมที่แตกต่าง ไวยากรณ์ของพวกเขามีคำสั่งฟังก์ชั่นที่ไม่ได้มาตรฐานซึ่งหมายความว่าฟังก์ชั่นจะได้รับการประเมินในเวลาทำงานไม่ใช่เวลาในการแยกวิเคราะห์ตามที่เกิดขึ้นกับFunctionDeclaration
s ในการใช้งานเหล่านั้นเราจะได้รับฟังก์ชั่นแรกที่กำหนดไว้
ฟังก์ชั่นสามารถประกาศได้หลายวิธีเปรียบเทียบสิ่งต่อไปนี้ :
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;
};