जावास्क्रिप्ट के "इन" लूप में "var" या नहीं "var"


99

for-inजावास्क्रिप्ट में लूप लिखने का सही तरीका क्या है ? ब्राउज़र मेरे द्वारा यहां दिखाए गए दो तरीकों में से किसी के बारे में शिकायत नहीं करता है। सबसे पहले, यह दृष्टिकोण है जहां पुनरावृत्ति चर xस्पष्ट रूप से घोषित किया गया है:

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

और वैकल्पिक रूप से यह दृष्टिकोण जो अधिक स्वाभाविक रूप से पढ़ता है लेकिन मुझे सही नहीं लगता है:

for (x in set) {
    ...
}

बस जब समस्या निवारण क्यों एक webpack उत्पन्न बंडल फ़ाइल पाश जहां के लिए एक में त्रुटियाँ पैदा कर रहा था इस पोस्ट में आए varइटरेटर घोषित करने के लिए उपयोग नहीं किया गया i: Uncaught ReferenceError: i is not defined। इसलिए मैं इसे अभी से उपयोग करूंगा: / webpack "ग्लोबल" वैरिएबल को अजीब तरह से मानता है, अधिक देखने के लिए: stackoverflow.com/a/40416826
user1063287

जवाबों:


103

उपयोग करें 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
इस सवाल का जवाब नहीं देता, यह लूप के लिए सामान्य है, इसके लिए नहीं।
इलिडान 4 चाहता है कि मोनिका वापस आ जाए

क्या कारण नहीं है == 5 लूप के लिए var की कमी से अधिक फहरा रहा है?
स्नेक

1
इसका एक अन्य महत्वपूर्ण पहलू यह है कि सख्त मोड में गोबल गुणों के निहित निर्माण की मनाही होती है, इसलिए "लूप डब्ल्यू / ओ में मानक विवरण" का उपयोग करना वास्तव में विफल हो जाएगा और एक संदर्भ संदर्भ वापस कर देगा।
दुग्गप्पी

2
लेकिन, जावा से आते हुए, सिर को varअंदर रखकर forऐसा लगता है कि यह लूप के लिए स्थानीय है, जो यह नहीं है। इसलिए, मैं नीचे उपयोगकर्ता 424220 की शैली पसंद करता हूं।
njlarsson

2
क्या होगा यदि आप एक दायरे में एक से अधिक लूप के लिए होते हैं? आपको या तो अनुक्रमणिका (कोई संस्करण) का पुन: उपयोग करना होगा, या आपको बहुत सारे और बहुत से नए चर (j, k, l, m,…) की घोषणा करनी होगी, जिसे आप फिर कभी उपयोग नहीं करेंगे।
armin

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एक संस्करण के बिना उपयोग करते हैं ), तो दो संस्करण समान होंगे।


3
अंत में स्पष्टीकरण और अच्छे उदाहरण के साथ एक पूर्ण उत्तर। और यह वास्तव में सवाल का जवाब देता है।
इलिदान्स 4 चाहता है कि मोनिका

22

आप वास्तव में साथ स्थानीय चर घोषित करना चाहिए var, हमेशा

आपको "इन ... इन" लूप्स का उपयोग नहीं करना चाहिए जब तक कि आप पूरी तरह से सुनिश्चित न हों कि आप क्या करना चाहते हैं। वास्तविक सरणियों (जो बहुत सामान्य है) के माध्यम से पुनरावृत्ति के लिए, आपको हमेशा एक संख्यात्मक सूचकांक के साथ एक लूप का उपयोग करना चाहिए:

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

"के लिए ... के साथ एक सादे सरणी के माध्यम से Iterating" अप्रत्याशित परिणाम हो सकते हैं, क्योंकि आपका लूप संख्यात्मक रूप से अनुक्रमित लोगों के अलावा सरणी के गुण उठा सकता है।

संपादित करें - 2015 में यहां .forEach()सरणी के माध्यम से पुनरावृति का उपयोग करना भी ठीक है :

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; ...)

C ++ में उस वेरिएबल को 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 में) के साथ घोषित) का उपयोग कर रहे होंगे ।

for(i=0; ...)या for(i in ...)यदि आप उपयोग करते हैं "use strict";(जैसा आपको चाहिए) और विफल iघोषित नहीं होने पर विफल हो जाएगा ।


6

उपयोग करना varसबसे साफ तरीका है, लेकिन दोनों यहां वर्णित अनुसार काम करते हैं: https://developer.mozilla.org/en/JavaScript/Reference/Statements/for...in

मूल रूप से, varआप यह सुनिश्चित करके कि आप एक नया चर बनाते हैं। अन्यथा आप गलती से पहले से परिभाषित चर का उपयोग कर सकते हैं।


4

मुझे लगता है कि var प्रदर्शन कारणों से अच्छा है।

जावास्क्रिप्ट पूरे वैश्विक दायरे के माध्यम से नहीं देखेगा कि क्या एक्स पहले से ही कहीं और मौजूद है।


3

सामान्य दृष्टिकोण से, पहला संस्करण एक इंडेक्स के लिए होगा जो लूप के दायरे में रहना चाहिए, जबकि दूसरा उस दायरे में कोई भी वैरिएबल होगा जहां लूप का कंस्ट्रक्टर मंगवाया गया था।

यदि आप लूप के लिए लूप इंडेक्स का उपयोग करने जा रहे हैं और इसके लिए अगली लाइनों में दूसरों की आवश्यकता नहीं होगी, तो बेहतर है कि वेरिएबल को "var" के साथ घोषित करें ताकि आप सुनिश्चित करें कि "x" लूप के इंडेक्स के साथ 0 के साथ इनिशियलाइज़ हो। जबकि दूसरा, यदि इस संदर्भ में अन्य "x" चर उपलब्ध है, तो यह लूप के सूचकांक द्वारा अधिलेखित हो जाएगा - यह कि आपके पास कुछ तार्किक त्रुटियां होंगी -।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.