ES6-এ "var" কীওয়ার্ডটি ব্যবহার করার কোনও কারণ আছে কি?


260

ইএস 6-তে বাবেলের গাইড বলেছেন:

letনতুন var

স্পষ্টতই কেবল পার্থক্যটি হ'ল varবর্তমান ফাংশনটি স্কোপড হয়ে যায় , যখন letবর্তমান ব্লকে স্কোপ হয় । এই উত্তরে কিছু ভাল উদাহরণ রয়েছে ।

আমি varES6 কোডে ব্যবহারের কোনও কারণ দেখতে পাচ্ছি না । এমনকি আপনি যদি পুরো ফাংশনে একটি প্রদত্ত পরিবর্তনশীলকে স্কোপ করতে চান, আপনি letফাংশন ব্লকের শীর্ষে ডিক্লারেশনটি রেখে এটি করতে পারেন , যা varপ্রকৃত সুযোগটি নির্দেশ করার জন্য আপনাকে যেভাবেই করা উচিত । এবং যদি আপনি কোনও forব্লক বা অন্য কোনও কিছুতে আরও সূক্ষ্মভাবে স্কোপ করতে চান তবে আপনি এটিও করতে পারেন।

সুতরাং আমার প্রবৃত্তিটি varES6 কোডটি লেখার সময় পুরোপুরি ব্যবহার বন্ধ করা ।

আমার প্রশ্ন, আমি কি এই সম্পর্কে ভুল? এমন কোন বৈধ মামলা আছে যেখানে varতার চেয়ে বেশি পছন্দনীয় হবে let?


3
আমি এটি এখনও চেষ্টা করি নি (যেহেতু আমি এখনও ES6 কোডটি লিখছি না), তবে মনে হয় varসচেতন সূচক হিসাবে ব্যবহার করা এই ভেরিয়েবলটি পুরো ফাংশনে স্কোপ করার উদ্দেশ্যে তৈরি করা একটি দরকারী "স্ব-ডকুমেন্টিং" কনভেনশন হতে পারে ।
jender00

10
যদি আপনি letকোনও ফাংশনের শীর্ষে কোনও বিবৃতি দেন তবে আমি মনে করি এটি ঠিক স্পষ্টভাবেই যে আপনি এটি পুরো ফাংশনটিতে স্কোপ করার ইচ্ছা করেছিলেন। আমি মনে করি না varব্যবহারটি এটিকে শীর্ষে সন্ধানের চেয়ে আরও স্পষ্ট করে তোলে।
কলম্ব

11
সত্যিই, আমি বিশ্বাস করি যে একমাত্র কারণ varএখনও বিদ্যমান, পিছনে-সামঞ্জস্য। এটি যদি না হয়, তারা varসম্পূর্ণরূপে সরিয়ে ফেলত, বা letপ্রথম স্থানে কখনও পরিচয় করিয়ে দেওয়া হত না , পরিবর্তে শব্দার্থক শব্দটির পরিবর্তে varএটির পক্ষে যুক্তিযুক্তভাবে কী হওয়া উচিত ছিল।
জার্গ ডব্লু মিট্টাগ

2
@ রায়টল কাইল সিম্পসন যা বলছেন তার ৯৯% এর সাথে আমি একমত, তবে তার ব্যবহারগুলি চালিয়ে যাওয়া আমার পক্ষে তাত্পর্য varবলে মনে হচ্ছে এবং তৃতীয় ধরণের পরিবর্তনশীল যে চারপাশে ছড়িয়ে পড়েছে তা নিশ্চিত করার পক্ষে যথেষ্ট নয়। আপনি letএকটি সম্পূর্ণ ফাংশনটিতে কেবলমাত্র ফাংশনের শীর্ষে রেখে এটিকে একটি স্কোপ করতে পারেন , যা varকোনও ব্লকে লেখার চেয়ে অনেক স্পষ্ট ((এটি সেই ব্লকটি থেকে উত্তোলন করার জন্য যাতে আপনি এটি ব্লকের বাইরে ব্যবহার করতে পারেন) - অদ্ভুত) তিনি হুঁশিয়ারি দিয়েছিলেন যে আপনি যদি letকোনও ফাংশন নিয়ে সুযোগ পান তবে "এটি ঠিক অবস্থান যা সিনট্যাক্সের চেয়ে পার্থক্যকে নির্দেশ করে", তবে আমি মনে করি এটি একটি ভাল জিনিস।
কলম

2
@ রায়টল আমিও সেই নিবন্ধটি পড়েছিলাম (এই আলোচনাটি পড়ার ঠিক আগে) এবং আমি তার খুব দুর্বল মামলার জন্য সত্যিই হতাশ হয়েছি var। তিনি রাখার জন্য তিনি যে উদাহরণগুলি উপস্থাপন করেছেন তা সংবিধানযুক্ত varবলে মনে হয় - এবং এটি গুরুতর কোডিং ত্রুটির উপর ভিত্তি করে । কোনও ত্রুটি হিসাবে চালানো এবং ভাষার ক্রিয়াগুলি ব্যবহারের চেয়ে এমন ত্রুটিগুলি সংশোধন করতে বাধ্য হওয়া আরও ভাল যে এটির সাথে দূরে সরে যায়! এরপরে কী, ক্র্যাশ প্রতিরোধের জন্য সমস্ত কিছু চেষ্টা / ক্যাপচারে গুটিয়ে ফেলার পরামর্শ দিন? সেই লিঙ্কটির বাকী অংশটি ভাল তবে আমি সেই বিশেষ অংশটির সাথে মোটেও একমত নই।
মেরে

উত্তর:


217

ডগ ক্রকফোর্ড তাঁর আলোচনায় এই মুহূর্তে আলোচনা letকরেছেন , " দ্য বেটার পার্টস "।

letমুল বক্তব্যটি হ'ল, ভুল বোঝাবুঝির উত্স এড়িয়ে চলে, esp। ব্লক-স্কোপ সহ ভাষা দ্বারা সেট করা প্রত্যাশা সহ প্রোগ্রামারদের জন্য। একজন varআছে ফাংশন সুযোগ যদিও এটি (এটা একটি পরিবর্তনশীল যে ফাংশন সর্বত্র দৃশ্যমান ঘোষণা) দেখায় মত এটা আছে সুযোগ ব্লক

var সম্ভবত এখনও মেশিন দ্বারা উত্পাদিত কোডের মতো চরম ক্ষেত্রে কার্যকর হতে পারে তবে আমি সেখানে শক্তভাবে প্রসারিত করছি।

( constএটিও নতুন এবং এতে ব্লক স্কোপ রয়েছে let x = {'hi': 'SE'}you আপনি পুনরায় অর্পণ করার xপরে, যখন const y = xআপনি পুনরায় সাইন করতে পারবেন না yThat's এটি প্রায়শই পছন্দনীয় কারণ এটি দুর্ঘটনাক্রমে আপনার অধীনে থেকে কিছু পরিবর্তন হতে পারে এমন কিছু রাখে clear তবে স্পষ্টতই, আপনি এখনও অবজেক্টটি সংশোধন করতে পারবেন y.hi = 'SO'যদি না আপনি এটি জমে দিন।)

বাস্তবে, আপনার ছাপ ES6 এর জন্য ঠিক: অ্যাডাপ্ট letএবং const। ব্যবহার বন্ধ করুন var

( "বেটার পার্টস" এর আরেকটি পারফরম্যান্সে ডগ বলেছেন যে সমস্যাগুলির সমাধানের=== চেয়ে কেন যুক্ত করা হয়েছিল । কিছু "বিস্ময়কর" ফলাফল উত্পন্ন করে, তাই কেবল গ্রহণ করুন ))=======


একটি উদ্ঘাটন উদাহরণ

মোজিলা বিকাশকারী নেটওয়ার্ক একটি উদাহরণ দেয় যেখানে varউদ্দেশ্য হিসাবে কাজ করে না। তাদের উদাহরণটি এমন একটি বাস্তববাদী যা onclickওয়েব পৃষ্ঠায় হ্যান্ডলারগুলি সেট করে । এটি একটি ছোট পরীক্ষার কেস:

var a = [];
(function () {
   'use strict';
   for (let i = 0; i < 5; ++i) { // *** `let` works as expected ***
     a.push( function() {return i;} );
   }
} ());
console.log(a.map( function(f) {return f();} ));
// prints [0, 1, 2, 3, 4]

// Start over, but change `let` to `var`.
// prints [5, 5, 5, 5, 5]

varআমাদের ব্যর্থ করে কারণ সমস্ত লুপ পুনরাবৃত্তি একই ফাংশন-স্কোপড iভেরিয়েবলটি ভাগ করে , যার 5লুপ শেষ হওয়ার পরে মান রয়েছে ।


6
তিনি == পরিবর্তে === অবলম্বন সম্পর্কে একই উত্তর দেন। দ্বিতীয়টি ভেঙে গেছে তবে ইএস স্ট্যান্ডার্ড কমিটি এটিকে পরিবর্তন করতে চায়নি, তাই তারা যুক্ত করেছে === এর অর্থ কী তা পুরোপুরি নিশ্চিত নয়। ==মোটেই ভাঙ্গা হয় না। এটিকে কেবল equality comparison using coersionচেক আউট github.com/getify/ You
Dont-

13
@ আম্মারসিএসই এটি নিখুঁত জবরদস্তিতে একটি দুর্দান্ত 39 পৃষ্ঠার ডক। প্রোগ্রামিং করার সময় কে এই সব মাথায় রাখতে পারে? ডগের অর্থ "ভাঙ্গা" সংক্ষেপে স্ট্যাকওভারফ্লো . com / a / 359509 / 1682419 সংক্ষেপে বলা হয়েছে , সংক্ষেপে, কিছুটা পাওয়া সহজ যখন মূল্য প্রকারগুলি আমাদের ধারণার চেয়ে আলাদা হয়। আপনি কি এই সব ভবিষ্যদ্বাণী করতে পারেন? [ '1.0' == 1.0, [1.0] == 1.0, [1.0] == '1.0', ['1.0'] == 1.0, [null] == '', [null] == 'null', '00' == false, [] == [], [] == 0, [] == '', [] == false, [] == true, [010] - [4] == ' 4.0 ', !![0], !![1], [0] == true, [1] == true, 1 == [[1]], 0 == [[0]], '1' == [1] ]
জেরি 101

2
ঠিক আছে, এই উদাহরণগুলির বেশিরভাগটিতে একটি অ্যারে অপারেণ্ড জড়িত। আপনি টু স্ট্রিংয়ের দিকে তাকালে এবং কীভাবে এটি অবজেক্টগুলির জন্য প্রয়োগ করা হয় ফলাফলটি বোঝা সহজ । যাইহোক, যদি এটি হ'ল ভাঙা বলতে বোঝানো হয় তবে আমি এটি সম্পূর্ণরূপে দেখতে পাচ্ছি that :-)
আম্মারসিএসইআই

3
কেন কনস্ট যখনই এটি পরিবর্তনযোগ্য না - কেবল জিজ্ঞাসা করছেন? আমি বলতে চাচ্ছি, বাস্তব পছন্দ এটা মধ্যে নয় letএবং varবরং মধ্যে let, varএবংconst
shabunc

4
varনকশা অনুযায়ী কাজ করে, তবে কত লোক প্রত্যাশা করে না। এটি একটি ব্যবহারযোগ্যতা বাগ, বাস্তবায়ন বাগ নয়।
জেরি 101

12

আপনি যদি সঠিক কোডটি লিখতে থাকেন তবে আপনি সম্ভবত কোনও বিবরণী পরিবর্তন ছাড়াই সমস্ত varবিবৃতি বিবৃতিতে রূপান্তর করতে সক্ষম হবেন let

letপছন্দনীয় কারণ এটি এমন একটি সুযোগকে হ্রাস করে যেখানে কোনও শনাক্তকারী দৃশ্যমান। এটি আমাদের প্রথম ব্যবহারের সাইটে নিরাপদে ভেরিয়েবলগুলি ঘোষণা করতে দেয়।

constতার থেকে ভাল let। আপনার যদি কোনও রেফারেন্সকে রূপান্তর করতে না হয় তবে একটি constঘোষণাপত্রটি ব্যবহার করুন । letইউনিটযুক্ত ভেরিয়েবলের উপস্থিতি হ্রাস করার সাথে সাথে কোডটি সাধারণভাবে সহজতর করার পক্ষে এর সমস্ত সুবিধা রয়েছে all আপনার যদি কোনও রেফারেন্সকে রূপান্তর করতে হবে কিনা তা আপনি নিশ্চিত না হন, constযতক্ষণ না আপনি নিজেকে স্পষ্টভাবে এটি করার প্রয়োজন বোধ করেন ততক্ষণ এটিকে ঘোষণা করুন ।


5

আমি অগত্যা আপনি ভুল বলে মনে করি না তবে ভের ব্যবহারের ক্ষেত্রে সতর্কতা রয়েছে। মূলত, letবিকাশকারীদের জাভাস্ক্রিপ্টের বোকামির কাছাকাছি পেতে সহায়তা করা উচিত, বিশেষত নামকরণ বিরোধের সাথে। varএটি বন্ধ ফাংশন স্কোপটিতে যেতে চায় বলে এটির বৃহত্তর সুযোগ রয়েছে বলে মনে হয়। এমন সময় আসবে যখন আপনার ভার প্রয়োজন হয়, যেমন কোনও ফাংশনের অভ্যন্তরের ব্লকের মধ্যে থাকতে যখন আপনার একটি অস্থায়ী পরিবর্তনশীল প্রয়োজন তখন অন্যথায়, বর্ণের চেয়ে letবেশি পছন্দ করা বিকাশকারীদের নামকরণের বিরোধে সহায়তা করবে help হালকা নোটে, এটি ES6 প্রবর্তনের প্রায় সময় let


3
varএকটি ব্লকের একটি টেম্পি পুরো ফাংশনের ভিতরেই পাওয়া যায়, ব্লক-স্কোপড নয়। এটি একটি বিভ্রান্তিমূলক বৈশিষ্ট্য।
জেরি 101

1

আমি একমত হতে চাই যে এসএস-এ কেবল "লেট" ব্যবহার করা উচিত। এএফআইকে, একটি "লেট" পুনরায় ঘোষণার ফলে একটি ত্রুটি উত্পন্ন হয় (যা ভাল), যখন "ভার" এর সাথে আপনি কেবল মানটিকে ওভাররাইড করে (যদিও এসএস 5 এর "কঠোর মোড" এটিও যত্নশীল করে তোলে)।


-4

letএর অর্থ "চলক সমান হওয়া যাক" এটি একটি ঘোষণা, অন্য কথায়, একটি সূচনা এবং অ্যাসাইনমেন্ট।

এটি constঅবশ্যই কোনটির অর্থ "ধ্রুবক" এর বিপরীতে বিদ্যমান - যা ভেরিয়েবলের বিপরীত।

অন্যান্য কিছু ভাষাগুলি ঘোষণার সময় বস্তুর পরিবর্তে প্রকৃত অবজেক্টের একটি উপসর্গ ব্যবহার করে (উদাহরণস্বরূপ def"সংজ্ঞায়িত ফাংশন" এর জন্য একটি শর্টহ্যান্ড) "ডিফ" হচ্ছে তার বিন্দুটি পুরোপুরি অনুপস্থিত।

Let জাভাস্ক্রিপ্টে এই শব্দার্থবিরোধী যোগ করে।

যৌক্তিকভাবে, আপনি পাশাপাশি একটি ধ্রুবক সমান কিছু দিতে পারেন, যেহেতু "লেট" কীওয়ার্ডটির কাজ মেমরির দায়িত্ব দেয়।

সমস্যাটি দেখা দেয় কারণ varমূলশব্দটি আগে constসমর্থিত হওয়ার আগেই চালু হয়েছিল, সুতরাং পিছনে সামঞ্জস্যতা নির্দেশ করে যা varপ্রয়োজনের সাথে চলক বোঝায় না। (এটি একটি ধ্রুবক মান নির্ধারণ করতেও ব্যবহৃত হতে পারে))

অতএব, letভুল অবস্থানে পরিচয় । নিশ্চিত আমরা স্মরণ করি যে যে আভিধানিক এটা ভুল করতে, তারাও এর আভিধানিক সুযোগ পরিবর্তন করার সিদ্ধান্ত নিয়েছে letবনাম var, তাই যখন ডিবাগ অসঙ্গতি আমাদের মন সর্বাগ্রে হয়।

অন্য কথায়, letউপস্থিত রয়েছে কারণ লোকেরা (যার অর্থ ভাষা রক্ষণাবেক্ষণকারীরা) মনে করেছিল যে জাভাস্ক্রিপ্টটি খুব সামঞ্জস্যপূর্ণ, এটি সমস্ত আইডিয়াম এবং আইডিয়োসিএনসিজে দক্ষতা অর্জন করেছে, আরও কামনা করে।

সাইড নোট, varযদি আপনি বলেন ব্লকগুলিকে ক্লোজার হিসাবে বিবেচনা করতে চান তবে "তীর" ব্লকগুলিতে কাজ করে না (কারণ ব্লকগুলি ক্লোজার হিসাবে গণ্য varকরার আগে চালু হয়েছিল), তবে letতা করে।


6
-1: পেডেন্টিক, অসহায় এবং মূলত মতামত ভিত্তিক।
জোয়েল মুলার

ফিজিয়ারাওন এখানে শুধু আমাদের সাথে রসিকতা করছে।
জেরি 101

আমি আপনার লেজিকাল ফর্মটি অপছন্দের প্রতি সহানুভূতিশীল letকারণ এটি জাভাস্ক্রিপ্টে একই বিভাগে অন্যান্য কীওয়ার্ডগুলির স্বরের সাথে মতবিরোধপূর্ণ। তবুও এটি প্রশ্নের উত্তর দেয় না, এবং বিশেষভাবে দেওয়া হয় না। Downvoted
Aluan হাদ্দাদ

3
letকেবল আরও জটিলতার জন্য বিকাশকারীরা নয়। এটি প্রকৃতপক্ষে স্বজ্ঞাগতভাবে আরও বোধগম্য, কারণ আপনি যখন লুপ-ও-ওয়ারগুলি ওভার বন্ধ করেন, বন্ধটি ভেরার শেষ মানটি বজায় রাখে, তবে আপনি যখন একই কাজটি করেন তখন লুপের প্রতিটি বন্ধনের নিজস্ব মান থাকে যাক, একটি লা উপরে উদাহরণস্বরূপ @ জেরি 101 দ্বারা
TKoL
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.