আমি শুনেছি যে অ্যাক্সেস let
এবং const
মানগুলি সেগুলি শুরুর আগেই অস্থায়ী ডেড জোনReferenceError
নামক কোনও কারণের কারণ হতে পারে ।
টেম্পোরাল ডেড জোন কী, এটি কীভাবে সুযোগ এবং উত্তোলনের সাথে সম্পর্কিত এবং কোন পরিস্থিতিতে এটির মুখোমুখি হচ্ছে?
আমি শুনেছি যে অ্যাক্সেস let
এবং const
মানগুলি সেগুলি শুরুর আগেই অস্থায়ী ডেড জোনReferenceError
নামক কোনও কারণের কারণ হতে পারে ।
টেম্পোরাল ডেড জোন কী, এটি কীভাবে সুযোগ এবং উত্তোলনের সাথে সম্পর্কিত এবং কোন পরিস্থিতিতে এটির মুখোমুখি হচ্ছে?
উত্তর:
let
এবং এর const
থেকে দুটি বিস্তৃত পার্থক্য রয়েছে var
:
var
এটি ঘোষণার আগে একটি অ্যাক্সেসের ফলাফল রয়েছে undefined
; এটি ছুঁড়ে দেওয়ার ঘোষণার আগে let
বা অ্যাক্সেস করা :const
ReferenceError
console.log(aVar); // undefined
console.log(aLet); // causes ReferenceError: aLet is not defined
var aVar = 1;
let aLet = 2;
এই উদাহরণগুলি থেকে এটি প্রদর্শিত হয় যে let
ঘোষণাগুলি (এবং const
, একইভাবে কাজ করে) উত্তোলন করা যাবে না , যেহেতু aLet
এটি কোনও মূল্য নির্ধারিত হওয়ার আগে উপস্থিত নেই।
যে মামলা, however- নয় let
এবং const
করছে উত্তোলন (যেমন var
, class
এবং function
), কিন্তু সুযোগ লিখে এবং যেখানে তারা অ্যাক্সেস করা যাবে না ঘোষিত হওয়ার মধ্যে একটি নির্দিষ্ট সময়ের নেই। এই সময়কালটি টেম্পোরাল ডেড জোন (টিডিজেড) ।
টিডিজেড নির্ধারিত পরিবর্তে ঘোষণার পরে শেষ aLet
হয় :
//console.log(aLet) // would throw ReferenceError
let aLet;
console.log(aLet); // undefined
aLet = 10;
console.log(aLet); // 10
এই উদাহরণটি দেখানো হয়েছে যে let
উত্তোলন করা হয়েছে:
let x = 'outer value';
(function() {
// start TDZ for x
console.log(x);
let x = 'inner value'; // declaration ends TDZ for x
}());
ক্রেডিট: টেম্পোরাল ডেড জোন (টিডিজেড) অননুমোদিত
x
অভ্যন্তরীণ সুযোগে অ্যাক্সেস এখনও একটি কারণ ReferenceError
। যদি let
উত্তোলন না করা হয় তবে এটি লগ হবে outer value
।
টিডিজেড একটি ভাল জিনিস কারণ এটি বাগগুলি হাইলাইট করতে সহায়তা করে it কোনও মান ঘোষণার আগে অ্যাক্সেস করা খুব কমই ইচ্ছাকৃত is
টিডিজেড ডিফল্ট ফাংশন আর্গুমেন্টগুলিতেও প্রযোজ্য। আর্গুমেন্টগুলি বাম থেকে ডানদিকে মূল্যায়ন করা হয় এবং প্রতিটি যুক্তি টিডিজেডে নির্ধারিত না হওয়া পর্যন্ত থাকে:
// b is in TDZ until its value is assigned
function testDefaults(a=b, b) { }
testDefaults(undefined, 1); // throws ReferenceError because the evaluation of a reads b before it has been evaluated.
ব্যাবেল.জেএস ট্রান্সপ্লেরারে টিডিজেড ডিফল্টরূপে সক্ষম হয় না । REPL এ এটি ব্যবহার করতে "হাই কমপ্লায়েন্স" মোডটি চালু করুন । es6.spec.blockScoping
সিএলআই বা লাইব্রেরি হিসাবে এটি ব্যবহার করতে পতাকা সরবরাহ করুন ।
আরও পড়ার প্রস্তাবিত: টিডিজেড ডিমেস্টিফাইড এবং ইএস 6 লেট, কনস্ট এবং গভীরতার মধ্যে "টেম্পোরাল ডেড জোন" (টিডিজেড) ।
let foo
কোনও ব্লকে এটিকে উত্তোলন এবং সেই ব্লকের শীর্ষে ঘোষণা করা হয়। let foo
এটির সূত্রপাত হওয়ার কারণগুলির রেখা । এবং foo = xyz
এটি একটি মান নির্ধারিত করে।
উত্তোলন:
let
, const
, var
সব পেতে উত্তোলন প্রক্রিয়া আছে।
(এর অর্থ তারা উপরে গিয়ে স্কোপের শীর্ষে ঘোষণা করে))
Initialisation:
var
প্রাথমিক প্রক্রিয়াটি দিয়েও যান এবং এর প্রাথমিক মান পান undefined
।let
, const
প্রাথমিক প্রক্রিয়াটি ছুঁড়ে ফেলেনি, তাই তাদের মানগুলি এখনও অ্যাক্সেসযোগ্য, যদিও তারা ইতিমধ্যে ঘোষণা করেছে। কি তাদের ভিতরে রাখাtemporal dead zone
তাই শীঘ্রই:
উত্তোলন প্রক্রিয়া:
var
,let
,const
Initialisation প্রক্রিয়া:var
লেট এবং কনস্টের ভেরিয়েবলের ক্ষেত্রে মূলত টেম্পোরাল ডেড জোন একটি অঞ্চল is
"আপনার পরিবর্তনশীল ঘোষণার আগে",
অর্থাৎ যেখানে আপনি এই ভেরিয়েবলের মান অ্যাক্সেস করতে পারবেন না, এটি একটি ত্রুটি ছুঁড়ে দেবে।
প্রাক্তন।
let sum = a + 5; //---------
//some other code // | ------> this is TDZ for variable a
// |
console.log(sum) //---------
let a = 5;
উপরের কোড একটি ত্রুটি দেয়
যখন আমরা ভেরিয়েবল 'এ' ব্যবহার করে ভেরিয়েবল ব্যবহার করি, একই কোডটি ত্রুটি দেয় না
প্রাক্তন।
var sum = a;
console.log(sum) //prints undefined
var a = 5;
undefined
এবং 5
)। Declaratation এর var a
উত্তোলন করা হয়, inifialisation কোড settng a
থেকে 5 নয়।