এটি কাজ করে না কারণ এটি একটি হিসাবে পার্স করা হচ্ছে FunctionDeclaration, এবং ফাংশন ঘোষণার নাম সনাক্তকারী বাধ্যতামূলক ।
যখন আপনি এটি প্রথম বন্ধনী দিয়ে ঘিরেছেন তখন এটি হিসাবে মূল্যায়ন করা হয় FunctionExpression, এবং ফাংশন এক্সপ্রেশনগুলি নামকরণ করা যায় কি না।
ব্যাকরণটি এর FunctionDeclarationমতো দেখতে:
function Identifier ( FormalParameterListopt ) { FunctionBody }
এবং FunctionExpressionএস:
function Identifieropt ( FormalParameterListopt ) { FunctionBody }
আপনি দেখতে পাচ্ছেন Identifier(আইডেন্টিফায়ার অপ্ট ) টোক ইনটি al FunctionExpressionচ্ছিক, সুতরাং আমাদের নাম নির্ধারিত ছাড়াই একটি ফাংশন এক্সপ্রেশন থাকতে পারে:
(function () {
alert(2 + 2);
}());
বা নামযুক্ত ফাংশন এক্সপ্রেশন:
(function foo() {
alert(2 + 2);
}());
পেরেন্টেসিস (আনুষ্ঠানিকভাবে গ্রুপিং অপারেটর নামে পরিচিত ) কেবলমাত্র প্রকাশের চারপাশে থাকতে পারে এবং একটি ফাংশন এক্সপ্রেশন মূল্যায়ন করা হয়।
ব্যাকরণ দুটি উত্পাদন অস্পষ্ট হতে পারে, এবং তারা ঠিক একই দেখতে পারে, উদাহরণস্বরূপ:
function foo () {} // FunctionDeclaration
0,function foo () {} // FunctionExpression
পার্সার জানে এটি প্রাসঙ্গিক যেখানে এটি প্রদর্শিত হবে তার উপর নির্ভর করে এটি একটি FunctionDeclarationবা একটি কিনা।FunctionExpression
উপরের উদাহরণে, দ্বিতীয়টি একটি এক্সপ্রেশন, কারণ কমা অপারেটরটি কেবলমাত্র এক্সপ্রেশনগুলি পরিচালনা করতে পারে।
অন্যদিকে, FunctionDeclarationএসগুলি কেবলমাত্র " Program" কোড বলা হয় যার অর্থ বিশ্বব্যাপী সুযোগের বাইরে কোড এবং FunctionBodyঅন্য ফাংশনের অভ্যন্তরের অভ্যন্তরে কোড উপস্থিত হতে পারে।
ব্লকের অভ্যন্তরীণ ক্রিয়াকলাপগুলি এড়ানো উচিত, কারণ তারা একটি অনির্দেশ্য আচরণের নেতৃত্ব দিতে পারে, যেমন:
if (true) {
function foo() {
alert('true');
}
} else {
function foo() {
alert('false!');
}
}
foo(); // true? false? why?
উপরের কোডটি আসলে একটি উত্পন্ন করা উচিত SyntaxError, যেহেতু Blockকেবলমাত্র একটি বিবৃতি থাকতে পারে (এবং ইসমাএসক্রিপ্ট নির্দিষ্টকরণ কোনও ফাংশন বিবৃতি সংজ্ঞায়িত করে না), তবে বেশিরভাগ বাস্তবায়ন সহনীয় এবং কেবলমাত্র দ্বিতীয়টি ফাংশন গ্রহণ করবে, যা সতর্কতা দেয় 'false!'।
মজিলা বাস্তবায়নগুলি - রাইনো, স্পাইডারমনকি - এর একটি আলাদা আচরণ রয়েছে। তাদের ব্যাকরণটিতে একটি অ-মানক ফাংশন বিবৃতি রয়েছে, যার অর্থ ফাংশনটি রান-টাইমে মূল্যায়ন করা হবে , পার্স সময়ে নয়, যেমনটি FunctionDeclarationএস এর সাথে ঘটে । এই বাস্তবায়নে আমরা প্রথম ফাংশনটি সংজ্ঞায়িত করব।
ক্রিয়াকলাপগুলি বিভিন্ন উপায়ে ঘোষণা করা যেতে পারে, নিম্নলিখিতগুলির সাথে তুলনা করুন :
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;
};