If you're seeing this message, it means we're having trouble loading external resources on our website.

তোমার যদি কোন ওয়েব ফিল্টার দেওয়া থাকে, তাহলে দয়া করে নিশ্চিত কর যে *.kastatic.org এবং *.kasandbox.org ডোমেইনগুলো উন্মুক্ত।

মূল বিষয়বস্তু

পর্যালোচনা: ফাংশন

এই অনুশীলনীতে ফাংশন সম্পর্কে আমরা যা শিখেছি এটি হল তার পর্যালোচনা।
প্রোগ্রামে কোড লেখার সময় আমরা চাই একটি কোড যেন পুনরায় প্রোগ্রামের অন্যান্য অংশে কোডটি সম্পূর্ণভাবে না লিখেই যেন ব্যবহার করা যায়। কোডগুলোকে শ্রেণিবদ্ধ করে একটি নাম দেওয়া দরকার, যেন পরবর্তীতে কোডগুলো আমরা সেই নামে কল করতে পারি এবং একেই ফাংশন বলা হয়।
ফাংশন তৈরি করার জন্য প্রথমেই ফাংশনটিকে আমাদের সংজ্ঞায়িত করতে হবে এবং এর একটি নাম দিতে হবে, একটি চলক যেভাবে তৈরি করা হয় এবং যেভাবে এটা সংজ্ঞায়িত করা হয়:
var sayHello = function() {
};
যে কোন কোড আমরা ফাংশনটির ভিতরে রাখতে পারি - একটি স্টেটমেন্ট কিংবা একাধিক স্টেটমেন্ট - আমরা এখানে কি করতে চাইছি তার উপরে নির্ভর করে এটা হবে। এই ফাংশনে, দৈব একটি স্থানে আমরা একটি বার্তা আউটপুট হিসেবে প্রদর্শন করতে পারি:
var sayHello = function() {
   text("Halllllllo!", random(200), random(200));
};
এখন, আমরা যদি শুধুমাত্র ফাংশনটি লিখি, তাহলে কিছুই হবে না। ফাংশনের ভেতরে থাকা কোডটি প্রোগ্রামে চালানোর জন্য আমাদের ফাংশনটি "কল" করতে হবে, ফাংশনটির নাম লিখে তার পাশে ফাঁকা প্রথম বন্ধনী দিতে হবে:
sayHello();
এরপর আমরা ফাংশনটি যখন খুশি, যতবার খুশি কল করতে পারব!
sayHello();
sayHello();
sayHello();
আমরা প্রায় সময়ই চাই, যেন ফাংশনগুলো আমরা আমাদের সুবিধা মত পরিবর্তন করে ব্যবহার করতে পারি, প্রোগ্রামকে আমরা "কোডে থাকা কাজগুলো করার নির্দেশ দিতে পারি কিন্তু প্রোগ্রামের মধ্যে কিছু কোড প্রয়োজন অনুযায়ী আমরা পরিবর্তন করে দিতে পারি।" এভাবে আমরা যে কোডটি পাবো সেটা পুনরায় ব্যবহারযোগ্য এবং সহজে পরিবর্তনযোগ্য হবে, ফাংশন ব্যবহার এজন্যই সুবিধাজনক। আমরা এই কাজগুলো ফাংশনে "আর্গুমেন্ট" ব্যবহার করে করতে পারি, আর্গুমেন্ট ব্যবহার করে আমরা ফাংশনের কাজ পরিবর্তন করতে পারি এবং ফাংশনটি কল করার সময় আমরা আর্গুমেন্টটি দিয়েও দিতে পারি।
উদাহরণস্বরূপ, rect() এবং ellipse() আঁকানোর মতই যদি আমরা পর্দায় বার্তাটি প্রদর্শন করার স্থান নির্দিষ্ট করে দিতে চাই, তাহলে কি করতে হবে? বার্তাটি একটি স্থানে প্রদর্শন করার জন্য আমরা দুইটি স্থানাঙ্ক নির্দিষ্ট করে দিতে পারি:
sayHello(50, 100);
sayHello(150, 200);
এটিকে কাজ করানোর জন্য, আমাদের sayHello ফাংশনটির সংজ্ঞা এমনভাবে পরিবর্তন করতে হবে, যেন ফাংশনটি 2 টি আর্গুমেন্ট নিতে পারে এবং সেই আর্গুমেন্ট ব্যবহার করতে পারে:
var sayHello = function(xPos, yPos) {
   text("Halllllllo!", xPos, yPos);
};
যে আর্গুমেন্টগুলো ফাংশনের পাঠানো হয় সেগুলো ফাংশনের মধ্যে চলকের মত কাজ করে এবং এগুলোর নাম বন্ধনীর ভেতরে নিজের দেওয়া নামের উপর নির্ভর করে। আমরা সহজেই এগুলোকে ছোট কোন নাম দিতে পারি:
var sayHello = function(x, y) {
   text("Halllllllo!", x, y);
};
আমাদের ফাংশনগুলো যে কোন সংখ্যক আর্গুমেন্ট গ্রহণ করতে পারে - শূন্য, এক, দুই বা তারও বেশি। আমরা ফাংশনটিকে এমনভাবেও পরিবর্তন করতে পারি যেখানে ফাংশনটি আর্গুমেন্ট হিসেবে একটি নাম নিয়ে তাকে হ্যালো (hello) জানায়:
var sayHello = function(name) {
   text("Halllllllo, " + name, random(200), random(200));
};
তখন আমরা ফাংশনটিকে নিম্নরূপে কল করতাম:
sayHello("Winston");
sayHello("Pamela");
আমরা এই ধারণাগুলো একত্রিত করে ফাংশনে, নাম এবং অবস্থানের জন্য তিনটি আর্গুমেন্ট পাঠাতে পারি:
var sayHello = function(name, x, y) {
   text("Halllllllo " + name, x, y);
};
এটাকে আমরা নিম্নরূপে কল করতে পারি:
sayHello("Winston", 10, 100);
এটা আসলে নির্ভর করছে তুমি ফাংশনটি দিয়ে কি করাতে চাইছ এবং ফাংশনটি তুমি কতটুকু পরিবর্তন করতে চাইছ তার উপর। কোন আর্গুমেন্ট ছাড়াই তুমি কাজ করা শুরু করতে পার এবং তারপর প্রয়োজন অনুযায়ী আর্গুমেন্ট যোগ করতে পার।
আসলে, এতক্ষণ ধরে আমরা ফাংশনকেই কল করছি - এভাবেই আমরা অঙ্কন এবং অ্যানিমেশনের কাজগুলো করেছি - উদাহরণস্বরূপ rect, ellipse, triangle ইত্যাদি। এই সবগুলো ফাংশন প্রসেসিং জেএস লাইব্রেরী থেকে এসেছে এবং সবসময় যাতে তুমি এটা ব্যবহার করতে পার তার জন্য আমরা খান একাডেমির প্রতিটি প্রোগ্রামেই এই লাইব্রেরী সংযুক্ত করে দিয়েছি। ব্যবহারের সুবিধার জন্য আমরা ফাংশনগুলোকে আগে থেকেই সংজ্ঞায়িত করে দিয়েছি এবং প্রোগ্রামে ব্যবহার করার জন্য কিছু কিছু ফাংশন, সুবিধা মত পরিবর্তন করে নেওয়া যেতে পারে। উদাহরণস্বরূপ, ellipse ফাংশনটি আমরা এখানে দিয়ে দিয়েছি কিন্তু cat নামে কোন ফাংশন এখানে দেওয়া নাই - যদি কোন প্রোগ্রামে ভিন্ন ভিন্ন অবস্থানে বিড়াল নিয়ে কাজ করতে হয় তাহলে তোমার নিজেকেই cat ফাংশন তৈরি করে নিতে হবে!
আমরা ফাংশন দিয়ে আরেকটি গুরুত্বপূর্ণ কাজ করতে পারি - এটা ব্যবহার করে আমরা কয়েকটি মান গ্রহণ করে, সেগুলো হিসাব করে, ফলাফল হিসেবে নতুন একটি মান ফিরিয়ে দিতে পারি। একটি ক্যালকুলেটরের ব্যবহার করে কি কি কাজ করা যায় সে সম্পর্কে চিন্তা করা যাক - যোগ করা, বিয়োগ করা, বর্গমূল হিসাব করা, গুণ করা ইত্যাদি। এই সবগুলো কাজ ফাংশন ব্যবহার করে করা সম্ভব, ফাংশন তথ্যগুলো ইনপুট হিসেবে নেয় এবং তার ফলাফলগুলো আউটপুট হিসাবে প্রদর্শন করে। ফাংশনটি ইনপুট হিসেবে আর্গুমেন্ট নিয়ে থাকে এবং ফলাফলটি রিটার্ন স্টেটমেন্টের মাধ্যমে আউটপুটে প্রদর্শন করে থাকে। এখানে এমন একটি ফাংশন দেওয়া হল যেটা দুইটি সংখ্যাকে যোগ করতে পারে এবং ফলাফলটি আউটপুটে প্রদর্শন করতে পারে:
var addNumbers = function(num1, num2) {
  var result = num1 + num2;
  return result;
};

var sum = addNumbers(5, 2);
text(sum, 200, 200); // Displays "7"
রিটার্ন স্টেটমেন্ট দুইটি কাজ করে থাকে: যে বিবৃতি মানটি কল করছে, ফলাফলটি হিসাব করে বের করার মাধ্যমে মানটি আউটপুট হিসেবে প্রদান করে থাকে (যে কারণে আমরা এটাকে sum চলকটির মধ্যে সংরক্ষণ করি) এবং কাজ শেষ হবার পরে সাথে সাথেই এটা ফাংশনটি থেকে বের হয়ে যায়। অর্থাৎ আমাদের ফাংশনের শেষ লাইনে যদি কোন কোড থাকে তাহলে এটি কার্যকর হবে না:
var addNumbers = function(num1, num2) {
  var result = num1 + num2;
  return result;
  result = result * 2; // silly!
};
ডাটা (data) ভিত্তিক প্রোগ্রামে রিটার্ন মানসহ ফাংশন থাকা খুবই উপকারি এবং এগুলোকে রাশির (expression) সাথে একত্রে ব্যবহার করা যায়:
var biggerSum = addNumbers(2, 5) + addNumbers(3, 2);
এমনকি ফাংশনের ভেতরেও ফাংশন কল করা যায়, যদিও অনেক সময় এটা পড়া বেশ কঠিন হয়ে যায়:
var hugeSum = addNumbers(addNumbers(5, 2), addNumbers(3, 7));
আমরা ফাংশন তৈরি করা শিখলাম, এখন আমাদেরকে একটি জরুরি বিষয় নিয়ে আলোচনা করতে হবে: সেটি হল, স্থানীয় চলক (local variable) বনাম সার্বজনীন চলক (global variable) নিয়ে আলোচনা।
একটি ফাংশনের ভেতরে নতুন একটি চলক তৈরি করলে, এটাকে স্থানীয় চলক বলা হয়। এটার কারণ হল শুধুমাত্র ঐ ফাংশনটিই, ঐ চলকটিকে ব্যবহার করতে পারে - ঐ চলকের বাইরে থাকা প্রোগ্রাম এটা ব্যবহার করতে পারে না। ফাংশনটির বাইরে এই সকল চলকের কোন অস্তিত্বই নেই। নিচের ফাংশনটিতে, localResult হল একটি স্থানীয় চলক:
var addNumbers = function(num1, num2) {
  var localResult = num1 + num2;
  println("The local result is: " + localResult);
  return localResult;
};
addNumbers(5, 7);
println(localResult); // oh noes!
কোডটি চালানোর সময়, শেষ লাইনে একটি ত্রুটি পাওয়া যাবে, যেখানে লেখা থাকবে: "localResult চলকটি সংজ্ঞায়িত নয়।" চলকটি শুধুমাত্র ফাংশনটির ভেতরে সংজ্ঞায়িত, কারণ ঐখানেই আমরা var localResult = লাইনটি লিখেছি এবং এর বাইরে এটি সংজ্ঞায়িত নয়।
ফাংশনের বাইরে যখন একটি চলক সংজ্ঞায়িত করা হয় তখন চলকটিকে সার্বজনীন চলক বলা হয়। কারণ সব ফাংশনই এটাকে বিভিন্ন কাজের জন্য ব্যবহার করতে পারে এবং একই সাথে পরিবর্তন করতে পারে।
var globalResult;

var addNumbers = function(num1, num2) {
  globalResult = num1 + num2;
  println("The global result is: " + globalResult);
};
addNumbers(5, 7);
println(globalResult);
উপরের কোডটি চালালে, কোন ত্রুটি এখানে পাওয়া যাবে না। কারণ globalResult চলকটিকে, আমরা ফাংশনের বাইরে সংজ্ঞায়িত করেছি, সে কারণে আমরা যেকোন জায়গা থেকে এটি ব্যবহার করতে পারি।
প্রতিটি প্রোগ্রামিং ভাষা একে অপরের থেকে ভিন্ন, কিন্তু জাভাস্ক্রিপ্টের ক্ষেত্রে, আমাদের এটা জানা প্রয়োজন যে চলকের "ফাংশন স্কোপ" আছে কিনা - একটি ফাংশন, ভেতরের স্থানীয় চলকগুলো এবং বাইরের সার্বজনীন চলকগুলো দেখতে পারে, কিন্তু অন্য ফাংশনের ভেতরে থাকা স্থানীয় চলকগুলো এটি দেখতে পারে না।

আলোচনায় অংশ নিতে চাও?

কোন আলাপচারিতা নেই।
ইংরেজি জানো? খান একাডেমির ইংরেজি সাইটে আরো আলোচনা দেখতে এখানে ক্লিক কর।