ভেরিয়েবল হল একটি ডেটা স্ট্রাকচার যা একটি মানের প্রতিনিধির নাম নির্ধারণ করে। তারা যে কোনো ধরনের তথ্য ধারণ করতে পারে.
একটি ভেরিয়েবলের নামকে একটি শনাক্তকারী বলা হয়। একজন বৈধ শনাক্তকারীকে অবশ্যই এই নিয়মগুলি অনুসরণ করতে হবে:
- শনাক্তকারীতে ইউনিকোড অক্ষর, ডলার চিহ্ন ($), আন্ডারস্কোর অক্ষর (_), সংখ্যা (0-9) এবং এমনকি কিছু ইউনিকোড অক্ষর থাকতে পারে।
- শনাক্তকারীরা হোয়াইটস্পেস ধারণ করতে পারে না, কারণ পার্সার ইনপুট উপাদানগুলিকে আলাদা করতে হোয়াইটস্পেস ব্যবহার করে। উদাহরণস্বরূপ, যদি আপনি
myVariable
এর পরিবর্তে একটি ভেরিয়েবলকেmy Variable
বলার চেষ্টা করেন, পার্সার দুটি শনাক্তকারী,my
এবংVariable
দেখতে পায় এবং একটি সিনট্যাক্স ত্রুটি ("অপ্রত্যাশিত টোকেন: সনাক্তকারী") নিক্ষেপ করে। শনাক্তকারীকে অবশ্যই একটি অক্ষর, আন্ডারস্কোর (
_
), বা ডলার চিহ্ন ($
) দিয়ে শুরু করতে হবে। সংখ্যা এবং শনাক্তকারীর মধ্যে বিভ্রান্তি রোধ করতে তারা সংখ্যা দিয়ে শুরু করতে পারে না:let 1a = true; > Uncaught SyntaxError: Invalid or unexpected token
যদি জাভাস্ক্রিপ্ট একটি শনাক্তকারীর শুরুতে নম্বরগুলিকে অনুমতি দেয়, তাহলে এটি শুধুমাত্র সংখ্যা দিয়ে তৈরি শনাক্তকারীকে অনুমতি দেবে, যা সংখ্যা হিসাবে ব্যবহৃত সংখ্যা এবং শনাক্তকারী হিসাবে ব্যবহৃত সংখ্যাগুলির মধ্যে দ্বন্দ্ব সৃষ্টি করবে:
let 10 = 20 10 + 5 > ?
" সংরক্ষিত শব্দ " যেগুলি ইতিমধ্যেই সিনট্যাক্টিক্যালি অর্থপূর্ণ সেগুলি সনাক্তকারী হিসাবে ব্যবহার করা যাবে না৷
আইডেন্টিফায়ারে বিশেষ অক্ষর থাকতে পারে না (
! . , / \ + - * =
)।
নিম্নলিখিতগুলি শনাক্তকারী তৈরি করার জন্য কঠোর নিয়ম নয়, তবে এগুলি হল শিল্পের সেরা অনুশীলন যা আপনার কোড বজায় রাখা সহজ করে তোলে৷ যদি আপনার নির্দিষ্ট প্রকল্পের বিভিন্ন মান থাকে, তাহলে ধারাবাহিকতার জন্য সেগুলি অনুসরণ করুন।
জাভাস্ক্রিপ্টের অন্তর্নির্মিত পদ্ধতি এবং বৈশিষ্ট্য দ্বারা সেট করা উদাহরণ অনুসরণ করে, ক্যামেল কেস (এছাড়াও "ক্যামেলকেস" হিসাবে স্টাইলাইজড) একাধিক শব্দ দিয়ে তৈরি শনাক্তকারীদের জন্য একটি খুব সাধারণ নিয়ম। ক্যামেল কেস হল শূন্যস্থান ছাড়াই উন্নত পঠনযোগ্যতার জন্য প্রথমটি ব্যতীত প্রতিটি শব্দের প্রথম অক্ষর বড় করার অভ্যাস।
let camelCasedIdentifier = true;
কিছু প্রকল্প প্রসঙ্গ এবং ডেটার প্রকৃতির উপর নির্ভর করে অন্যান্য নামকরণ প্রথা ব্যবহার করে। উদাহরণস্বরূপ, একটি ক্লাসের প্রথম অক্ষরটি সাধারণত বড় আকারের হয়, তাই বহু-শব্দ শ্রেণির নামগুলি প্রায়শই উটের কেসের একটি বৈকল্পিক ব্যবহার করে যা সাধারণত "আপার ক্যামেল কেস" বা প্যাসকেল কেস বলে।
class MyClass {
}
আইডেন্টিফায়ারদের তাদের থাকা ডেটার প্রকৃতি সংক্ষিপ্তভাবে বর্ণনা করা উচিত (উদাহরণস্বরূপ, theNumberOfDaysInTheCurrentMonth
এর চেয়ে currentMonthDays
একটি ভাল নাম) এবং এক নজরে স্পষ্টভাবে পড়ুন ( originalValue
val
এর চেয়ে ভাল)। এই মডিউল জুড়ে ব্যবহৃত myVariable
আইডেন্টিফায়ারগুলি বিচ্ছিন্ন উদাহরণের প্রেক্ষাপটে কাজ করে, কিন্তু প্রোডাকশন কোডে খুব অসহায় হবে কারণ তারা কী ডেটা রয়েছে সে সম্পর্কে কোনও তথ্য দেয় না।
আইডেন্টিফায়ারদের তাদের থাকা ডেটা সম্পর্কে খুব বেশি নির্দিষ্ট হওয়া উচিত নয়, কারণ স্ক্রিপ্টগুলি কীভাবে সেই ডেটাতে কাজ করে বা ভবিষ্যতের রক্ষণাবেক্ষণকারীরা যে সিদ্ধান্ত নেয় তার উপর নির্ভর করে তাদের মানগুলি পরিবর্তিত হতে পারে। উদাহরণ স্বরূপ, একটি ভেরিয়েবলকে প্রাথমিকভাবে শনাক্তকারী miles
প্রদত্ত প্রকল্পের পরে কিলোমিটারে একটি মান পরিবর্তন করতে হতে পারে, ভবিষ্যতের বিভ্রান্তি এড়াতে রক্ষণাবেক্ষণকারীদের সেই ভেরিয়েবলের কোনো রেফারেন্স পরিবর্তন করতে হবে। এটি প্রতিরোধ করতে, পরিবর্তে আপনার শনাক্তকারী হিসাবে distance
ব্যবহার করুন।
জাভাস্ক্রিপ্ট আন্ডারস্কোর অক্ষর ( _
) দিয়ে শুরু হওয়া শনাক্তকারীদের কোন বিশেষ সুবিধা বা অর্থ দেয় না, তবে তারা সাধারণত এটি দেখানোর জন্য ব্যবহার করা হয় যে একটি পরিবর্তনশীল, পদ্ধতি বা সম্পত্তি "ব্যক্তিগত", যার অর্থ এটি শুধুমাত্র ভিতরে ব্যবহারের জন্য উদ্দেশ্যে করা হয়েছে অবজেক্টের প্রেক্ষাপট যা এটি ধারণ করে এবং সেই প্রসঙ্গের বাইরে অ্যাক্সেস বা পরিবর্তন করা উচিত নয়। এটি একটি কনভেনশন যা অন্যান্য প্রোগ্রামিং ল্যাঙ্গুয়েজ থেকে সম্পাদিত হয় এবং জাভাস্ক্রিপ্টের প্রাইভেট প্রপার্টি যোগ করার পূর্ববর্তী।
পরিবর্তনশীল ঘোষণা
একটি শনাক্তকারী সম্পর্কে জাভাস্ক্রিপ্টকে সচেতন করার একাধিক উপায় রয়েছে, একটি প্রক্রিয়া যাকে একটি পরিবর্তনশীল "ঘোষণা" বলা হয়। let
, const
, বা var
কীওয়ার্ড ব্যবহার করে একটি ভেরিয়েবল ঘোষণা করা হয়।
let myVariable;
যে কোনো সময় পরিবর্তন করা যেতে পারে এমন একটি ভেরিয়েবল ঘোষণা করতে let
বা var
ব্যবহার করুন। এই কীওয়ার্ডগুলি জাভাস্ক্রিপ্ট ইন্টারপ্রেটারকে বলে যে অক্ষরের একটি স্ট্রিং একটি শনাক্তকারী যা একটি মান থাকতে পারে।
একটি আধুনিক কোডবেসে কাজ করার সময়, var
এর পরিবর্তে let
ব্যবহার করুন। var
এখনও আধুনিক ব্রাউজারগুলিতে কাজ করে, তবে এর কিছু অজ্ঞাত আচরণ রয়েছে যা জাভাস্ক্রিপ্টের প্রথমতম সংস্করণগুলিতে সংজ্ঞায়িত করা হয়েছিল এবং তারপরে পিছনের সামঞ্জস্য রক্ষা করার জন্য পরে পরিবর্তন করা যায়নি। var
এর ডিজাইনের সাথে কিছু সমস্যা সমাধানের জন্য ES6 এ যোগ করা let
।
একটি ঘোষিত ভেরিয়েবলকে ভেরিয়েবলের একটি মান নির্ধারণ করে শুরু করা হয়। একটি ভেরিয়েবলের মান নির্ধারণ বা পুনরায় বরাদ্দ করতে একটি একক সমান চিহ্ন ( =
) ব্যবহার করুন। আপনি একই বিবৃতির অংশ হিসাবে এটি করতে পারেন যা এটি ঘোষণা করে:
let myVariable = 5;
myVariable + myVariable
> 10
আপনি এখনই শুরু না করে let
(বা var
) দিয়ে একটি ভেরিয়েবল ঘোষণা করতে পারেন। যদি আপনি তা করেন, আপনার কোড এটিকে একটি মান নির্ধারণ না করা পর্যন্ত ভেরিয়েবলের প্রাথমিক মানটি undefined
থাকে।
let myVariable;
myVariable;
> undefined
myVariable = 5;
myVariable + myVariable
> 10
একটি undefined
মান সহ একটি পরিবর্তনশীল একটি অনির্ধারিত ভেরিয়েবল থেকে আলাদা যার শনাক্তকারী এখনও ঘোষণা করা হয়নি৷ আপনি ঘোষণা করেননি এমন একটি পরিবর্তনশীল উল্লেখ করা একটি ত্রুটির কারণ।
myVariable
> Uncaught ReferenceError: myVariable is not defined
let myVariable;
myVariable
> undefined
একটি মানের সাথে একটি শনাক্তকারীর সংযোগকে সাধারণত "বাইন্ডিং" বলা হয়। সিনট্যাক্স যেটি let
, var
, বা const
কীওয়ার্ড অনুসরণ করে তাকে "বাইন্ডিং তালিকা" বলা হয় এবং এটি একাধিক কমা-বিভাজিত পরিবর্তনশীল ঘোষণার অনুমতি দেয় (প্রত্যাশিত সেমিকোলন দিয়ে শেষ হয়)। এটি নিম্নলিখিত কোড স্নিপেটগুলিকে কার্যকরীভাবে অভিন্ন করে তোলে:
let firstVariable,
secondVariable,
thirdVariable;
let firstVariable;
let secondVariable;
let thirdVariable;
একটি ভেরিয়েবলের মান পুনরায় বরাদ্দ করা let
(বা var
) ব্যবহার করে না, কারণ জাভাস্ক্রিপ্ট ইতিমধ্যেই জানে যে ভেরিয়েবলটি বিদ্যমান:
let myVariable = true;
myVariable
> true
myVariable = false;
myVariable
> false
আপনি তাদের বিদ্যমান মানগুলির উপর ভিত্তি করে ভেরিয়েবলগুলিকে নতুন মানগুলি পুনরায় বরাদ্দ করতে পারেন:
let myVariable = 10;
myVariable
> 10
myVariable = myVariable * myVariable;
myVariable
> 100
আপনি একটি উত্পাদন পরিবেশে let
ব্যবহার করে একটি পরিবর্তনশীল পুনরায় ঘোষণা করার চেষ্টা করলে, আপনি একটি সিনট্যাক্স ত্রুটি পাবেন:
let myVariable = true;
let myVariable = false;
> Uncaught SyntaxError: redeclaration of let myVariable
ব্রাউজারগুলির বিকাশকারী সরঞ্জামগুলি let
(এবং class
) পুনঃঘোষণা সম্পর্কে আরও অনুমোদিত, তাই আপনি আপনার বিকাশকারী কনসোলে একই ত্রুটি দেখতে পাবেন না।
লিগ্যাসি ব্রাউজার সামঞ্জস্য রক্ষা করার জন্য, var
কোনো প্রেক্ষাপটে ত্রুটি ছাড়াই অপ্রয়োজনীয় পুনরায় ঘোষণার অনুমতি দেয়:
var myVariable = true;
var myVariable = false;
myVariable\
> false
const
একটি ধ্রুবক ঘোষণা করতে const
কীওয়ার্ড ব্যবহার করুন, একটি ভেরিয়েবলের একটি প্রকার যা অবিলম্বে শুরু করা আবশ্যক, এবং তারপর পরিবর্তন করা যাবে না। ধ্রুবকের শনাক্তকারীরা let
(এবং var
) ব্যবহার করে ঘোষিত ভেরিয়েবলের মতো একই নিয়ম অনুসরণ করে।
const myConstant = true;
myConstant
> true
আপনি অবিলম্বে একটি মান বরাদ্দ না করে একটি ধ্রুবক ঘোষণা করতে পারবেন না, কারণ ধ্রুবকগুলি তৈরি হওয়ার পরে পুনরায় বরাদ্দ করা যায় না, তাই যেকোনো অপ্রবর্তিত ধ্রুবক চিরকালের জন্য undefined
থাকবে। আপনি যদি এটি শুরু না করে একটি ধ্রুবক ঘোষণা করার চেষ্টা করেন তবে আপনি একটি সিনট্যাক্স ত্রুটি পাবেন:
const myConstant;
Uncaught SyntaxError: missing = in const declaration
const
দিয়ে ঘোষিত একটি ভেরিয়েবলের মান পরিবর্তন করার চেষ্টা করার ফলে আপনি let
(বা var
) দিয়ে ঘোষিত একটি ভেরিয়েবলের মান পরিবর্তন করতে পারেন একটি টাইপ ত্রুটির কারণ:
const myConstant = true;
myConstant = false;
> Uncaught TypeError: invalid assignment to const 'myConstant'
যাইহোক, যখন একটি ধ্রুবক একটি বস্তুর সাথে যুক্ত হয়, তখন সেই বস্তুর বৈশিষ্ট্যগুলি পরিবর্তন করা যেতে পারে ।
const constantObject = { "firstvalue" : true };
constantObject
> Object { firstvalue: true }
constantObject.secondvalue = false;
constantObject
> Object { firstvalue: true, secondvalue: false }
একটি ধ্রুবক যা একটি বস্তু ধারণ করে একটি পরিবর্তনযোগ্য ডেটা মানের একটি অপরিবর্তনীয় রেফারেন্স । যদিও ধ্রুবক নিজেই পরিবর্তন করা যায় না, উল্লেখিত বস্তুর বৈশিষ্ট্যগুলি পরিবর্তন, যোগ করা বা সরানো যেতে পারে:
const constantObject = { "firstvalue" : true };
constantObject = false
> Uncaught TypeError: invalid assignment to const 'constantObject'
যখন আপনি একটি ভেরিয়েবলকে পুনরায় বরাদ্দ করার আশা করেন না, তখন এটি একটি ধ্রুবক তৈরি করা সর্বোত্তম অনুশীলন। const
ব্যবহার করা আপনার ডেভেলপমেন্ট টিম বা প্রোজেক্টের ভবিষ্যত রক্ষণাবেক্ষণকারীদের বলে যে সেই মানটি পরিবর্তন না করতে, আপনার কোড কীভাবে এটি ব্যবহার করা হয় সে সম্পর্কে অনুমানগুলি ভাঙতে না পারে—উদাহরণস্বরূপ, একটি ভেরিয়েবল শেষ পর্যন্ত একটি প্রত্যাশিত ডেটা টাইপের বিরুদ্ধে মূল্যায়ন করা হবে।
পরিবর্তনশীল সুযোগ
একটি ভেরিয়েবলের সুযোগ হল একটি স্ক্রিপ্টের অংশ যেখানে সেই ভেরিয়েবলটি পাওয়া যায়। একটি ভেরিয়েবলের সুযোগের বাইরে, এটি সংজ্ঞায়িত করা হবে না - একটি undefined
মান ধারণকারী একটি শনাক্তকারী হিসাবে নয়, তবে যেন এটি ঘোষণা করা হয়নি৷
একটি ভেরিয়েবল ঘোষণা করার জন্য আপনি যে কীওয়ার্ড ব্যবহার করেন এবং যে প্রেক্ষাপটে আপনি এটিকে সংজ্ঞায়িত করেন তার উপর নির্ভর করে, আপনি স্টেটমেন্ট ( ব্লক স্কোপ ), স্বতন্ত্র ফাংশন ( ফাংশন স্কোপ ) বা সম্পূর্ণ জাভাস্ক্রিপ্ট অ্যাপ্লিকেশন ( গ্লোবাল স্কোপ ) ব্লক করতে স্কোপ ভেরিয়েবল ব্যবহার করতে পারেন।
ব্লক সুযোগ
let
বা const
ব্যবহার করে আপনি যে ভেরিয়েবল ডিক্লেয়ার করেন তার সবথেকে কাছাকাছি থাকা ব্লক স্টেটমেন্টে স্কোপ করা হয়, যার মানে ভেরিয়েবলটি শুধুমাত্র সেই ব্লকের মধ্যেই অ্যাক্সেস করা যায়। একটি ব্লক স্কোপড ভেরিয়েবল অ্যাক্সেস করার চেষ্টা করার চেষ্টা করা ব্লকের বাইরে একটি ভেরিয়েবল অ্যাক্সেস করার চেষ্টা করার মতো একই ত্রুটি সৃষ্টি করে যা বিদ্যমান নেই:
{
let scopedVariable = true;
console.log( scopedVariable );
}
> true
scopedVariable
> ReferenceError: scopedVariable is not defined
যতদূর জাভাস্ক্রিপ্ট উদ্বিগ্ন, একটি ব্লক স্কোপড ভেরিয়েবল ব্লকের বাইরে বিদ্যমান নেই যা এটি ধারণ করে। উদাহরণস্বরূপ, আপনি একটি ব্লকের ভিতরে একটি ধ্রুবক ঘোষণা করতে পারেন এবং তারপর সেই ব্লকের বাইরে অন্য একটি ধ্রুবক ঘোষণা করতে পারেন যা একই শনাক্তকারী ব্যবহার করে:
{
const myConstant = false;
}
const myConstant = true;
scopedConstant;
> true
যদিও একটি ঘোষিত ভেরিয়েবল তার মূল ব্লকের মধ্যে প্রসারিত করতে পারে না, এটি সমস্ত বংশধর ব্লকের জন্য উপলব্ধ :
{
let scopedVariable = true;
{
console.log( scopedVariable );
}
}
> true
একটি ঘোষিত ভেরিয়েবলের মান একটি বংশধর ব্লকের মধ্যে থেকে পরিবর্তন করা যেতে পারে:
{
let scopedVariable = false;
{
scopedVariable = true;
}
console.log( scopedVariable );
}
> true
একটি নতুন ভেরিয়েবল ত্রুটি ছাড়াই একটি বংশধর ব্লকের ভিতরে let
বা const
দিয়ে আরম্ভ করা যেতে পারে, এমনকি যদি এটি একটি অভিভাবক ব্লকে একটি পরিবর্তনশীল হিসাবে একই শনাক্তকারী ব্যবহার করে:
{
let scopedVariable = false;
{
let scopedVariable = true;
}
console.log( scopedVariable );
}
> false
ফাংশন স্কোপ
var
ব্যবহার করে ঘোষিত ভেরিয়েবলগুলি তাদের নিকটতম ধারণকারী ফাংশন (অথবা একটি ক্লাসের ভিতরে স্ট্যাটিক ইনিশিয়ালাইজেশন ব্লক ) স্কোপ করা হয়।
function myFunction() {
var scopedVariable = true;
return scopedVariable;
}
scopedVariable;
> ReferenceError: scopedVariable is not defined
একটি ফাংশন কল করার পরেও এটি রয়েছে। যদিও ফাংশনটি কার্যকর করার সময় ভেরিয়েবলটি আরম্ভ করা হয়, সেই ভেরিয়েবলটি এখনও ফাংশনের সুযোগের বাইরে অনুপলব্ধ:
function myFunction() {
var scopedVariable = true;
return scopedVariable;
}
scopedVariable;
> ReferenceError: scopedVariable is not defined
myFunction();
> true
scopedVariable;
> ReferenceError: scopedVariable is not defined
বিশ্বব্যাপী সুযোগ
একটি গ্লোবাল ভেরিয়েবল একটি সম্পূর্ণ জাভাস্ক্রিপ্ট অ্যাপ্লিকেশন জুড়ে উপলব্ধ, যেকোনো এবং সমস্ত ব্লক এবং ফাংশনের ভিতরে, পৃষ্ঠার যেকোনো স্ক্রিপ্টে।
যদিও এটি একটি পছন্দসই ডিফল্ট বলে মনে হতে পারে, একটি অ্যাপ্লিকেশনের যেকোনো অংশ অ্যাক্সেস এবং পরিবর্তন করতে পারে এমন ভেরিয়েবলগুলি অপ্রয়োজনীয় ওভারহেড যোগ করতে পারে, অথবা একই শনাক্তকারী সহ একটি অ্যাপ্লিকেশনের অন্য কোথাও ভেরিয়েবলের সাথে সংঘর্ষের কারণ হতে পারে। এটি তৃতীয় পক্ষের লাইব্রেরি এবং ব্যবহারকারী বিশ্লেষণের মতো জিনিসগুলি সহ একটি পৃষ্ঠার রেন্ডারিংয়ের সাথে জড়িত যে কোনও এবং সমস্ত জাভাস্ক্রিপ্টের ক্ষেত্রে প্রযোজ্য৷ অতএব, যখনই সম্ভব বিশ্বব্যাপী সুযোগকে দূষিত করা এড়াতে এটি সর্বোত্তম অনুশীলন।
প্যারেন্ট ফাংশনের বাইরে var
ব্যবহার করে বা প্যারেন্ট ব্লকের বাইরে let
বা const
ব্যবহার করে ঘোষিত যেকোনো ভেরিয়েবল বিশ্বব্যাপী:
var functionGlobal = true; // Global
let blockGlobal = true; // Global
{
console.log( blockGlobal );
console.log( functionGlobal );
}
> true
> true
(function() {
console.log( blockGlobal );
console.log( functionGlobal );
}());
> true
> true
একটি ভেরিয়েবলকে স্পষ্টভাবে ঘোষণা না করে একটি মান বরাদ্দ করা (অর্থাৎ এটি তৈরি করতে var
, let
, বা const
ব্যবহার না করে) একটি ভেরিয়েবলকে বৈশ্বিক সুযোগে উন্নীত করে, এমনকি যখন একটি ফাংশন বা ব্লকের ভিতরে শুরু করা হয়। এই প্যাটার্ন ব্যবহার করে তৈরি একটি পরিবর্তনশীলকে কখনও কখনও "উহ্য বিশ্ব" বলা হয়।
function myFunction() {
globalVariable = "global";
return globalVariable
}
myFunction()\
> "global"
globalVariable\
> "global"
পরিবর্তনশীল উত্তোলন
ভেরিয়েবল এবং ফাংশন ঘোষণাগুলি তাদের সুযোগের শীর্ষে উত্তোলন করা হয়, যার অর্থ জাভাস্ক্রিপ্ট ইন্টারপ্রেটার একটি স্ক্রিপ্টের যে কোনও বিন্দুতে ঘোষিত যে কোনও ভেরিয়েবলকে প্রক্রিয়া করে এবং স্ক্রিপ্টটি কার্যকর করার আগে কার্যকরভাবে এটিকে এর এনক্লোজিং স্কোপের প্রথম লাইনে নিয়ে যায়। এর মানে হল যে var
ব্যবহার করে ঘোষিত একটি ভেরিয়েবল একটি ত্রুটির সম্মুখীন না হয়ে ভেরিয়েবল ঘোষণা করার আগে উল্লেখ করা যেতে পারে:
hoistedVariable
> undefined
var hoistedVariable;
কারণ শুধুমাত্র ভেরিয়েবল ডিক্লেয়ারেশন হোস্ট করা হয়, ইনিশিয়ালাইজেশন নয়, যে ভেরিয়েবলগুলি var
, let
, বা const
দিয়ে স্পষ্টভাবে ঘোষণা করা হয়নি সেগুলি হোস্ট করা হয় না:
unhoistedVariable;
> Uncaught ReferenceError: unhoistedVariable is not defined
unhoistedVariable = true;
পূর্বে উল্লিখিত হিসাবে , একটি ঘোষিত কিন্তু অপ্রবর্তিত ভেরিয়েবলকে undefined
একটি মান বরাদ্দ করা হয়। এই আচরণটি উত্তোলিত পরিবর্তনশীল ঘোষণার ক্ষেত্রেও প্রযোজ্য, তবে শুধুমাত্র var
ব্যবহার করে ঘোষিতদের ক্ষেত্রে।
hoistedVariable
> undefined
var hoistedVariable = 2 + 2;
hoistedVariable\
> 4
এই অজ্ঞাত আচরণটি মূলত জাভাস্ক্রিপ্টের প্রথমতম সংস্করণে করা ডিজাইনের সিদ্ধান্তগুলির একটি হোল্ডওভার, এবং বিদ্যমান সাইটগুলি ভাঙার ঝুঁকি ছাড়া পরিবর্তন করা যাবে না।
let
এবং const
পরিবর্তে একটি ত্রুটি ছুঁড়ে দিয়ে এই আচরণের সমাধান করুন যখন একটি ভেরিয়েবল তৈরি হওয়ার আগে এটি অ্যাক্সেস করা হয়:
{
hoistedVariable;
let hoistedVariable;
}
> Uncaught ReferenceError: can't access lexical declaration 'hoistedVariable' before initialization
এই ত্রুটিটি "hoistedVariable is not defined" ত্রুটি থেকে ভিন্ন যা আপনি একটি অঘোষিত পরিবর্তনশীল অ্যাক্সেস করার চেষ্টা করার সময় আশা করতে পারেন। যেহেতু জাভাস্ক্রিপ্ট ভেরিয়েবলটি উত্তোলন করেছে, এটি সচেতন যে প্রদত্ত সুযোগের মধ্যে ভেরিয়েবলটি তৈরি করা হবে। যাইহোক, undefined
এর মান সহ ঘোষণার আগে সেই পরিবর্তনশীলটিকে উপলব্ধ করার পরিবর্তে, দোভাষী একটি ত্রুটি ছুড়ে দেয়। let
বা const
(বা class
) দিয়ে ঘোষিত ভেরিয়েবলগুলিকে বলা হয় "টেম্পোরাল ডেড জোন" ("TDZ") তাদের এনক্লোজিং ব্লকের শুরু থেকে কোডের বিন্দু পর্যন্ত যেখানে ভেরিয়েবল ঘোষণা করা হয়েছে।
টেম্পোরাল ডেড জোন লেখকদের জন্য var
চেয়ে let
এর আচরণকে আরও বেশি স্বজ্ঞাত করে তোলে। এটি const
এর ডিজাইনের জন্যও গুরুত্বপূর্ণ। যেহেতু ধ্রুবক পরিবর্তন করা যায় না, একটি ধ্রুবককে তার সুযোগের শীর্ষে উত্তোলন করা হয় এবং undefined
একটি অন্তর্নিহিত মান দেওয়া হয় তখন একটি অর্থপূর্ণ মান দিয়ে আরম্ভ করা যায় না।
আপনার উপলব্ধি পরীক্ষা করুন
আপনি কি ধরনের অক্ষর দিয়ে একটি শনাক্তকারী শুরু করতে পারেন?
একটি পরিবর্তনশীল ঘোষণা করার পছন্দের পদ্ধতি কোনটি যার মান যেকোনো সময় পরিবর্তন করা যেতে পারে?