টেম্পোরাল ডেড জোন কী?


150

আমি শুনেছি যে অ্যাক্সেস letএবং constমানগুলি সেগুলি শুরুর আগেই অস্থায়ী ডেড জোনReferenceError নামক কোনও কারণের কারণ হতে পারে ।

টেম্পোরাল ডেড জোন কী, এটি কীভাবে সুযোগ এবং উত্তোলনের সাথে সম্পর্কিত এবং কোন পরিস্থিতিতে এটির মুখোমুখি হচ্ছে?


6
ES6 এ উত্তোলন করা যাক না কনট দিয়ে ভেরিয়েবলের সম্ভাব্য নকল কী ঘোষণা করা হয়? - যদিও প্রশ্ন টিডিজেডের দিকে মনোনিবেশ করে না, উত্তরগুলি মূলত একই
বার্গি

উত্তর:


201

letএবং এর constথেকে দুটি বিস্তৃত পার্থক্য রয়েছে var:

  1. এগুলি ব্লক স্কোপড
  2. varএটি ঘোষণার আগে একটি অ্যাক্সেসের ফলাফল রয়েছে undefined; এটি ছুঁড়ে দেওয়ার ঘোষণার আগে letবা অ্যাক্সেস করা :constReferenceError

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 লেট, কনস্ট এবং গভীরতার মধ্যে "টেম্পোরাল ডেড জোন" (টিডিজেড)



@ জেরোফ্লাগল ভাল লিঙ্ক, ধন্যবাদ। এছাড়াও এটি বলে: "foo অঘোষিত নয়, এটি নির্বিঘ্নযুক্ত", সেই ভাষাটি উপরের উত্তরে পরিষ্কার / সঠিক করতে সহায়ক হবে। let fooকোনও ব্লকে এটিকে উত্তোলন এবং সেই ব্লকের শীর্ষে ঘোষণা করা হয়। let fooএটির সূত্রপাত হওয়ার কারণগুলির রেখা । এবং foo = xyzএটি একটি মান নির্ধারিত করে।
এজেপি

2
আমি এই একটি মহান পোস্ট মনে হয়! তবে, আমি এই ধারণার মধ্যে ছিলাম যে 'লেট' উত্তোলনের বিষয় নয়? আমি এটি মজিলা ডক্সে পেয়েছি: developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / I'm আমি একটি curmudgeon হওয়ার চেষ্টা করছি না, আমি ঠিক কৌতূহলী ছিলাম এবং স্পষ্টির জন্য খুলেছি।
21:39

1
@ জিওজ এমডিএন পৃষ্ঠা এখনও বলে যে তারা উত্তোলন করা হয়নি। আপনি যা বলছেন তা যদি সত্যই নিশ্চিত হন তবে আপনার এটি সম্পাদনা করার চেষ্টা করা উচিত। আমার মনে হয় সে সম্পর্কে আমার একটি প্রশ্ন পোস্ট করা উচিত।
ডাবলআর্ট

1
@ জিউজ আইএমও, আপনি হয় বলতে পারেন যে তারা তোলা হয়েছে তবে টিডিজেডের কারণে তাদের ঘোষণাপত্রটি পৌঁছানোর আগে এগুলি অ্যাক্সেস করা যাবে না, বা আপনি বলতে পারেন যে তারা তোলা হয় নি তবে টিডিজেড তাদের কোনও ত্রুটি ছুঁড়ে দেওয়ার কারণ তৈরি করবে। কার্যতঃ উভয় বক্তব্য সমানভাবে সত্য। আমি মনে করি, আপনি "উত্তোলন" শব্দটি একটি বিমূর্ত অর্থে ব্যবহার করছেন, যেমন "উত্তোলন =" যখনই ইঞ্জিনটি চলকের অস্তিত্ব সম্পর্কে সচেতন থাকে "। তাই বলে? এছাড়াও, চশমা কি তাতে বলে?
ডাবলআর্ট

7

উত্তোলন:
let , const, varসব পেতে উত্তোলন প্রক্রিয়া আছে।
(এর অর্থ তারা উপরে গিয়ে স্কোপের শীর্ষে ঘোষণা করে))

Initialisation:

  • varপ্রাথমিক প্রক্রিয়াটি দিয়েও যান এবং এর প্রাথমিক মান পান undefined
  • যদিও let, constপ্রাথমিক প্রক্রিয়াটি ছুঁড়ে ফেলেনি, তাই তাদের মানগুলি এখনও অ্যাক্সেসযোগ্য, যদিও তারা ইতিমধ্যে ঘোষণা করেছে। কি তাদের ভিতরে রাখাtemporal dead zone

তাই শীঘ্রই:

উত্তোলন প্রক্রিয়া: var, let, const
Initialisation প্রক্রিয়া: var


0

লেট এবং কনস্টের ভেরিয়েবলের ক্ষেত্রে মূলত টেম্পোরাল ডেড জোন একটি অঞ্চল 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;

কনসোল লগ দ্বিতীয় উদাহরণে "NaN" উত্পাদন করে (যোগ করার ফলাফল undefinedএবং 5)। Declaratation এর var aউত্তোলন করা হয়, inifialisation কোড settng aথেকে 5 নয়।
traktor53

হ্যাঁ, ঠিক আছে, কোনও সূচনা ছাড়াই উত্তোলন করা হয়। সুতরাং একটি অপরিবর্তিত করা হবে।
নিরঞ্জন হরপলে

উদ্ধৃত প্রথম উদাহরণটি সঠিক নয়, দয়া করে এটি সংশোধন করুন বা এটি সরান।
স্পিডির ওয়েব
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.