JavaScript-এ IIFE-এর প্রতিবন্ধকতা
আসুন দুটি কোড স্নিপেট দেখি।
প্রথমটি:
let result = 1
+function() {
return 2;
}();
console.log(result);
দ্বিতীয়টি:
let result = 1;
+function() {
return 2;
}();
console.log(result);
এই দুটি কোড স্নিপেট প্রায় অভিন্ন,
কিন্তু সেগুলি চালালে ফলাফল আলাদা হবে।
প্রথম কোডটি কনসোলে 3 নম্বরটি প্রিন্ট করবে,
এবং দ্বিতীয়টি - 1 নম্বরটি।
কেন এই পার্থক্য হল: সবকিছুর কারণ হল যে এক ক্ষেত্রে প্রথম লাইনের শেষে সেমিকোলন নেই, আর দ্বিতীয় ক্ষেত্রে - আছে।
আপনি জিজ্ঞাসা করতে পারেন: কিভাবে এটা সম্ভব, কারণ JavaScript-এ কমান্ডের শেষে সেমিকোলন বাধ্যতামূলক নয়! আসলে এটা সম্পূর্ণ সত্য নয়। আসুন বুঝতে চেষ্টা করি আসলে কী ঘটছে।
প্রথম কোডটি এভাবে পুনরায় লেখা যেতে পারে:
let result = 1 + function() {
return 2;
}();
console.log(result); // 3 প্রিন্ট করবে
এখনই এটা স্পষ্ট হয়ে যায় যে
একটির সাথে ফাংশন কলের ফলাফল যোগ করা হচ্ছে
তাৎক্ষণাৎ, অর্থাৎ 2। তাই চূড়ান্ত
ফলাফল হবে 3।
কিন্তু একটির পরে সেমিকোলন দিলে, ইন্টারপ্রিটার কোডটিকে ভিন্নভাবে বুঝবে:
// প্রথম কমান্ড:
let result = 1;
// দ্বিতীয় কমান্ড:
+function() {
return 2;
}();
// তৃতীয় কমান্ড:
console.log(result); // 1 প্রিন্ট করবে
অর্থাৎ, ভেরিয়েবলে অ্যাসাইনমেন্ট এবং তাৎক্ষণিক ফাংশন কল আলাদা কমান্ড হয়ে যাবে। আর সবই সেমিকোলন থাকার কারণে!
দেখা যাচ্ছে যে এই ক্ষেত্রে তাৎক্ষণিক ফাংশন কল
আসলে কিছুই করে না - শুধু
অকারণে 2 নম্বরটি ফেরত দেয়, যা
result ভেরিয়েবলকে কোনোভাবেই প্রভাবিত করে না।
আসুন তাহলে বুঝে নেওয়া যাক, কেন আমরা JavaScript-এ সেমিকোলন না লিখেও পারি। ধরুন আমাদের এইরকম কোড আছে সেমিকোলন ছাড়াই:
let result = 1 // result-এ 1 লেখা হবে
let test = 2 // test-এ 2 লেখা হবে
এটি সঠিকভাবে কাজ করে, কারণ ইন্টারপ্রিটার স্বয়ংক্রিয়ভাবে প্রতিটি লাইনের শেষে সেমিকোলন বসিয়ে দিয়েছে।
কিন্তু এই কোডটি দেখুন:
let result = 1
+ 2; // result-এ 3 লেখা হবে
এখন প্রথম লাইনের শেষে স্বয়ংক্রিয়ভাবে সেমিকোলন বসবে না, কারণ ইন্টারপ্রিটার বুঝতে পারে যে দ্বিতীয় লাইনের কমান্ডটি প্রথম লাইনের কমান্ডেরই অংশ।
কিন্তু আমরা নিজেরাই সেমিকোলন বসিয়ে দিলে - ফলাফল সম্পূর্ণ ভিন্ন হবে:
let result = 1; // result-এ 1 লেখা হবে
+ 2; // কমান্ডটি কিছুই করে না, কিন্তু ত্রুটিও হবে না
দেখা যাচ্ছে যে ইন্টারপ্রিটার নিজে থেকেই সেমিকোলন বসায়, শুধুমাত্র তখনই যখন পরবর্তী কমান্ডটি পূর্ববর্তী কমান্ডের অংশ না হয়।
এবং এখন এই কোডটি দেখুন:
let result = 1
+function() {
return 2;
}();
console.log(result);
প্রকৃতপক্ষে, দ্বিতীয় লাইন - শুধুমাত্র প্রথম লাইনের কমান্ডের ধারাবাহিকতা এবং ইন্টারপ্রিটার স্বয়ংক্রিয়ভাবে সেমিকোলন বসায় না। এই কারণেই,如果我们 প্রথম লাইনের শেষে নিজেরাই সেমিকোলন লিখি - ফলাফল সম্পূর্ণ ভিন্ন হবে। এটি ইঙ্গিত দেয় যে সমস্যা এড়ানোর জন্য, প্রয়োজনীয় স্থানে সর্বদা সেমিকোলন বসানো সর্বোত্তম।