2017-06-17 8 views
8

मुझे चलो और var के बीच का अंतर पता है। चलो ब्लॉक दायरा है और var कार्यात्मक दायरा है।सेटटाइम के अंदर let और var के बीच अंतर?

for(var i=0; i< 3; i++){ 
    setTimeout(function(){ 
     console.log(i); 
    }, 10); 
} 

output : 3 
     3 
     3 

मुझे पता है कि कोड ऊपर टुकड़ा काम कर रहा है (console.log(i) उस समय निष्पादित हो रहा है जब मैं का मूल्य 3 है, क्योंकि मैं के दायरे वैश्विक है)।

लेकिन

for(let i=0; i< 3; i++){ 
    setTimeout(function(){ 
     console.log(i); 
    }, 10); 
} 

output : 1 
     2 
     3 

ऊपर कोड स्निपेट मुझे भ्रमित। मेरे अनुसार यह संदर्भ त्रुटि फेंकना चाहिए (क्योंकि उस समय जब console.log(i) निष्पादित होता है, तो वैश्विक दायरे में नहीं, वैश्विक दायरे में नहीं, और मुझे वैश्विक रूप से घोषित/परिभाषित नहीं किया जाता है। इसलिए इसे संदर्भ त्रुटि देना चाहिए।)

कोई भी जो बता सकता है कि रनटाइम पर काम करने के लिए दूसरा कैसे लूप?

+2

चलो उपयोग करते समय प्रत्येक पुनरावृत्ति के लिए बंदरगाह के नए उदाहरण पर बंद हो जाता है। – Blindman67

+0

यदि कोई 'संदर्भ त्रुटि' फेंक दी जाएगी, तो कोई भी प्रकार का बंदरगाह काम नहीं करेगा। न तो फंक्शन स्कोप 'var' के लिए एक, न ही' चलो 'के लिए एक। –

+0

जब आपके पास समय है तो यह [लेख] (http://www.adequatelygood.com/JavaScript-Scoping-and-Hoisting.html) पढ़ें और पढ़ें। यह वास्तव में अच्छी तरह से scoping, hoisting आदि बताते हैं। – Fahmi

उत्तर

2

जब आप इस संदर्भ में let का उपयोग करते हैं, तो प्रत्येक पुनरावृत्ति पर एक नया बाध्यकारी/स्कोप बनाया जाता है। आप var साथ ES5 में एक समान व्यवहार हासिल करना चाहते हैं, तो आप एक Iife उपयोग करने के लिए:

for (var i = 0; i < 3; i++) { 
 
    (function (i) { 
 
    setTimeout(function() { 
 
     console.log(i); 
 
    }, 10); 
 
    })(i); 
 
}

3

दूसरे उदाहरण (let का प्रयोग करके) काम करता है क्योंकि एक समारोह सभी चर के ऊपर बंद हो जाएगा कि जब इसे घोषित किया जाता है तो दायरे में हैं। लूप के प्रत्येक पुनरावृत्ति को let के साथ एक नया चर बनाया जा रहा है, टाइमआउट में फ़ंक्शन वेरिएबल पर बंद हो जाता है और संदर्भ रखता है। जब टाइमआउट के बाद फ़ंक्शन को संदर्भित किया जाता है, तो इसके बंद चर भी होते हैं।

फ़ंक्शन बंद करने के बारे में अधिक जानकारी के लिए How do JavaScript closures work देखें।

3

यह बंद करने का जादू है। पक्ष अपने पाश

for(let i=0; i< 3; i++){ 
    setTimeout(function(){ 
     console.log(i); 
    }, 10); 
} 

में आप एक समारोह

function(){ 
    console.log(i); 
} 

की घोषणा कर रहे हैं साथ ही, पाश ही वाणी एक block

for(let i=0; i< 3; i++){ 
    // this is a block scope because it is contained in 
    // braces 
} 

चर let के साथ परिभाषित ब्लॉक scoped रहे हैं।

closure की वजह से

, समारोह आप पाश अंदर घोषित scopes जब तक यह कचरा एकत्र किया जाता है सभी चर इसके दायरे और उसके माता-पिता में घोषित करने के लिए उपयोग किया है।

एक बंद एक समारोह और लेक्सिकल वातावरण का संयोजन है जिसमें उस समारोह को घोषित किया गया था। इस माहौल में कोई भी स्थानीय चर शामिल है जो बंद होने पर बनाया गया था।

चर i में गुंजाइशहै जब setTimeout द्वारा इस्तेमाल किया कार्यों बनाई गई हैं। लूप के प्रत्येक पुनरावृत्ति के लिए i का संदर्भ i का एक अलग उदाहरण है।

फ़ंक्शन तब तक मौजूद है जब तक आपके द्वारा घोषित अंतराल तक नहीं पहुंच जाता। यही कारण है कि आपके लूप में घोषित 3 कार्यों में से प्रत्येक i का मान प्रिंट करता है; इसे शामिल क्षेत्र में घोषित किया गया था और फ़ंक्शन पर उपलब्ध रहता है।

संबंधित मुद्दे