জাভাস্ক্রিপ্টের "ইন-ইন" লুপটিতে "ভ্যার" বা কোনও "বর্ণ" নেই?


101

for-inজাভাস্ক্রিপ্টে একটি লুপ লেখার সঠিক উপায় কী ? ব্রাউজারটি আমি এখানে যে দুটি পদ্ধতির দেখায় সেগুলির কোনওটিরই সম্পর্কে অভিযোগ জারি করে না। প্রথমত, এই পদ্ধতির যেখানে পুনরাবৃত্তি ভেরিয়েবলটি xস্পষ্টভাবে ঘোষণা করা হয়েছে:

for (var x in set) {
    ...
}

এবং বিকল্পভাবে এই পদ্ধতির যা আরও স্বাভাবিকভাবে পড়ে তবে আমার কাছে এটি সঠিক মনে হয় না:

for (x in set) {
    ...
}

শুধু যখন ট্রাবলশ্যুটিং কেন একটি webpack উত্পন্ন বান্ডিল ফাইল লুপ যেখানে একটি সময়ে ত্রুটি গচ্চা গেল পোস্টটি জুড়ে এসেছিল varপুনরুক্তিকারীর ঘোষণা করার জন্য ব্যবহার করা হয় নি i: Uncaught ReferenceError: i is not defined। : / Webpack একইরূপে "বিশ্বব্যাপী" weirdly ভেরিয়েবল, আরো দেখুন জন্য: তাই আমি এখন থেকে এটি ব্যবহার হবে stackoverflow.com/a/40416826
user1063287

উত্তর:


104

ব্যবহার করুন var, এটি ভেরিয়েবলের ক্ষেত্র হ্রাস করে অন্যথায় ভেরিয়েবল একটি varবিবৃতি সন্ধানের নিকটতম বন্ধ হওয়া পর্যন্ত দেখায় । যদি এটি খুঁজে না পায় varতবে এটি বৈশ্বিক (যদি আপনি কঠোর মোডে থাকেন তবে using strict, বৈশ্বিক ভেরিয়েবলগুলি একটি ত্রুটি ফেলে দেয়)। এটি নিম্নলিখিতগুলির মতো সমস্যার সৃষ্টি করতে পারে।

function f (){
    for (i=0; i<5; i++);
}
var i = 2;
f ();
alert (i); //i == 5. i should be 2

আপনি যদি লুপটিতে লিখেন var iতবে সতর্কতা দেখায় 2

জাভাস্ক্রিপ্ট স্কোপিং এবং উত্তোলন


4
প্রশ্নের উত্তর দিতে না, এই, লুপ জন্য স্বাভাবিক হয় এ জন্য জন্য নয়।
IllidanS4 মনিকা সমর্থন

লুপের জন্য ভ্যারির অভাবের চেয়ে i == 5 টি উত্তোলনের কারণে বেশি নয় কি?
স্নেকস

4
এর আর একটি আমদানি দিক হ'ল কঠোর মোডটি গোবলিক বৈশিষ্ট্যগুলির অন্তর্নিহিত সৃষ্টি নিষিদ্ধ করে, সুতরাং "ইন" লুপ ডাব্লু / ওরে স্ট্যান্ডার্ডটি ব্যবহার করলে ভেরি স্টেটমেন্টটি ব্যর্থ হয় এবং একটি রেফারেন্সেরর ফিরে আসে।
ডিকুগাপি

4
তবে, জাভা থেকে এসে মাথার varভিতরে puttingুকিয়ে দেওয়া forদেখতে মনে হচ্ছে এটি লুপের জন্য স্থানীয়, যা এটি নয়। সুতরাং, আমি নীচে ব্যবহারকারীর 422039 স্টাইল পছন্দ।
এনজেলারসন

4
আপনি যদি এক সুযোগে একাধিক ফর-লুপ রাখেন? আপনাকে হয় সূচকটি পুনরায় ব্যবহার করতে হবে (কোনও ভেরি নেই), অথবা আপনাকে প্রচুর এবং প্রচুর নতুন ভেরিয়েবলগুলি ঘোষণা করতে হবে (জে, কে, এল, এম, ...) যা আপনি আর কখনও ব্যবহার করবেন না।
আর্মিন

40

প্রথম সংস্করণ:

for (var x in set) {
    ...
}

নামক একটি স্থানীয় ভেরিয়েবল ঘোষণা করে x। দ্বিতীয় সংস্করণ:

for (x in set) {
    ...
}

না.

যদি xইতিমধ্যে কোনও স্থানীয় পরিবর্তনশীল (যেমন আপনার বর্তমান সুযোগে আপনার এক var x;বা var x = ...;অন্য কোথাও আগে রয়েছে (যেমন বর্তমান ফাংশন)) তবে তারা সমান হবে। যদি xইতিমধ্যে স্থানীয় ভেরিয়েবল না হয় তবে দ্বিতীয়টি ব্যবহার করে স্পষ্টতই একটি গ্লোবাল ভেরিয়েবল ঘোষণা করা হবে x। এই কোডটি বিবেচনা করুন:

var obj1 = {hey: 10, there: 15};
var obj2 = {heli: 99, copter: 10};
function loop1() {
    for (x in obj1) alert(x);
}
function loop2() {
    for (x in obj2) {
        loop1(); 
        alert(x);
    }
}
loop2();

আপনাকে সতর্ক করার জন্য এই আশা করতে পারে hey, there, heli, hey, there, copter, কিন্তু যেহেতু xএক এবং একই এটা সতর্ক হবে hey, there, there, hey, there, there। আপনি এটা চান না! var xআপনার forলুপগুলিতে ব্যবহার করুন ।

সর্বোপরি শীর্ষে: forলুপটি যদি বিশ্ব স্কোপে থাকে (যেমন কোনও ফাংশনে নয়) তবে স্থানীয় সুযোগ ( xআপনি যদি ব্যবহার করেন তবে সুযোগটি ঘোষিত হয় var x) বিশ্বব্যাপী স্কোপের মতোই (সুযোগটি xস্পষ্টভাবে ঘোষণা করা হয়) যদি আপনি xকোনও ভার ব্যতীত ব্যবহার করেন ), সুতরাং দুটি সংস্করণ অভিন্ন হবে।


4
পরিশেষে ব্যাখ্যা এবং সুন্দর উদাহরণ সহ একটি সম্পূর্ণ উত্তর। এবং এটি সত্যিই প্রশ্নের উত্তর।
IllidanS4

22

আপনি সত্যিই সাথে স্থানীয় ভেরিয়েবল ডিক্লেয়ার করা উচিত var, সবসময়

আপনি যা করতে চান তা পুরোপুরি নিশ্চিত না হওয়া অবধি আপনার "for ... in" লুপ ব্যবহার করা উচিত নয়। আসল অ্যারেগুলির মাধ্যমে পুনরাবৃত্তি করার জন্য (যা বেশ সাধারণ) আপনার সর্বদা একটি সংখ্যাসূচক সূচক সহ একটি লুপ ব্যবহার করা উচিত:

for (var i = 0; i < array.length; ++i) {
  var element = array[i];
  // ...
}

"For ... in" দিয়ে একটি সরল অ্যারের মাধ্যমে আইট্রেট করার ফলে অপ্রত্যাশিত পরিণতি হতে পারে, কারণ আপনার লুপটি সংখ্যাসূচকভাবে তালিকাবদ্ধগুলি ছাড়াও অ্যারের বৈশিষ্ট্যগুলি তুলতে পারে।

সম্পাদনা করুন - এখানে 2015 এ .forEach()অ্যারের মাধ্যমে পুনরাবৃত্তি করতে ব্যবহার করা ভাল to

array.forEach(function(arrayElement, index, array) {
  // first parameter is an element of the array
  // second parameter is the index of the element in the array
  // third parameter is the array itself
  ...
});

.forEach()পদ্ধতি IE9 পর থেকে এরে প্রোটোটাইপ উপস্থিত হয়।


12

আসলে, আপনি যদি forশিরোনামের মধ্যে ঘোষণাকে অপছন্দ করেন তবে আপনি এটি করতে পারেন:

var x;
for (x in set) {
    ...
}

এই প্রশ্নের অন্যান্য উত্তরে যেমন উল্লেখ করা হয়েছে, varএকেবারে ব্যবহার না করা বৈশ্বিক সম্পত্তি বরাদ্দের মতো অপ্রয়োজনীয় পার্শ্ব প্রতিক্রিয়া তৈরি করে।


9

আপনি লুপ ভেরিয়েবলটি যেখানে ঘোষণা করেন সেটিকে ব্যবহার করুন var। সুস্পষ্টভাবে ঘোষিত ভেরিয়েবলগুলির একটি আলাদা সুযোগ রয়েছে যা সম্ভবত আপনি যা চান তা নয়।


9
for(var i = 0; ...)

একটি সাধারণভাবে দেখা প্যাটার্ন তবে এটি থেকে পৃথক

for(int i; ...)

সি ++ তে যে ভেরিয়েবলটি forব্লকের সাথে বাদ যায় না । প্রকৃতপক্ষে, varএনকোলেজিং স্কোপ (ফাংশন) এর শীর্ষে উত্তোলন হয়ে যায় যাতে কোনও স্থানীয় iকার্যকরভাবে forলুপের আগে (বর্তমান স্কোপ / ফাংশন শুরুর পরে) এবং তার পরে উভয়ই উপলব্ধ থাকে।

অন্য কথায়, করছেন:

(function(){ //beginning of your current scope;
 //...
 for(var i in obj) { ... };
})();

এটার মতই:

(function(){ //beginning of your current scope;
 var i;
 //...
 for(i in obj) { ... };
})();

ব্লগের জন্য সুযোগটি সীমাবদ্ধ করতে ES6 এর letকীওয়ার্ড রয়েছে (পরিবর্তে var)।

অবশ্যই, আপনি স্থানীয় ভেরিয়েবল ব্যবহার করা উচিত (বেশী ঘোষিত পারেন varবা letবাconst (ES6 মধ্যে)) বরং অন্তর্নিহিত globals হয়।

for(i=0; ...)বা for(i in ...)ব্যর্থ হবে যদি আপনি ব্যবহার করেন "use strict";(যেমনটি আপনার করা উচিত) এবং iঘোষণা না করে।


6

ব্যবহার varকরা সবচেয়ে সহজ উপায়, তবে উভয়ই এখানে বর্ণিত হিসাবে কাজ করে: https://developer.mozilla.org/en/JavaScript/References/Statements/for...in

মূলত, ব্যবহার করে varআপনি নিশ্চিত হন যে আপনি একটি নতুন ভেরিয়েবল তৈরি করেছেন। অন্যথায় আপনি ঘটনাক্রমে পূর্বনির্ধারিত ভেরিয়েবলটি ব্যবহার করতে পারেন।


4

আমি মনে করি পারফরম্যান্সের কারণে ভার ভাল good

এক্স ইতিমধ্যে অন্য কোথাও উপস্থিত আছে কিনা তা দেখতে জাভাস্ক্রিপ্ট পুরো বিশ্বব্যাপী সুযোগটি দেখতে পাবে না।


3

সাধারণ দৃষ্টিকোণ থেকে, প্রথম সংস্করণটি এমন একটি সূচকের জন্য হবে যা লুপের স্কোপের মধ্যে থাকতে হবে, অন্যটি লুপের কনস্ট্রাক্টরকে ডেকে আনার সুযোগে কোনও পরিবর্তনশীল হবে।

আপনি যদি লুপটির জন্য লুপের সূচকটি ভিতরে ব্যবহার করতে যাচ্ছেন এবং পরবর্তী লাইনে এটির অন্যদের প্রয়োজন হবে না, তবে "ভার" দিয়ে ভেরিয়েবলটি আরও ভালভাবে ঘোষণা করুন যাতে আপনি নিশ্চিত হন যে লুপের সূচকটি 0 দিয়ে শুরু হয়েছে, "এক্স" অন্যটি, অন্য "এক্স" ভেরিয়েবল যদি এই প্রসঙ্গে পাওয়া যায় তবে লুপের সূচকে এটি ওভাররাইট হয়ে যাবে - এতে আপনার কিছু যুক্তিযুক্ত ত্রুটি থাকবে -।

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