2015-07-01 7 views
8

से बंद करने योग्य है, इसलिए मुझे अपने जेएस कंपाइलर में एक चेतावनी मिली है, लेकिन क्या आप मुझे समझा सकते हैं कि क्या यह वास्तव में मेरे कोड को निष्पादित करने के तरीके को प्रभावित करेगा?जेएस म्यूटेबल वेरिएबल

for (x = 0; x < levels.length; x++) { 
    var level = levels[x]; 
    var candlesOnLevel = $.grep(relevantCandles, function(candles, index) { 
     return parseInt($(candles).css("top").replace(/px/, "")) === level; 
    }); 
} 
+1

आपको क्या चेतावनी मिल रही है? – Tushar

+1

आपका कोड ठीक है। संकलक यह मान रहा है कि '$ .grep' में गुजरने वाली कॉलबैक असीम है लेकिन यह नहीं है। – CodingIntrigue

+0

चेतावनी सिर्फ "उत्परिवर्तनीय परिवर्तनीय बंद होने से सुलभ है", हालांकि उत्तर के लिए ty! –

उत्तर

4

यह भी चेतावनी देता है इससे पहले कि ग्रेप "के लिए कॉलबैक" इसे करने के लिए हो जाता है कि level संशोधित किया जा सकता - ज़ाहिर है, आईडीई नहीं जानता है कि $.grep एक कॉलबैक नहीं ले करता है, लेकिन एक फिल्टर समारोह। (नोट एक कॉलबैक लेने कि async कार्यों को आम तौर पर एक ही हस्ताक्षर है)

यदि यह थे एक अतुल्यकालिक कॉलबैक फ़ंक्शन, तो जब level का मूल्य पढ़ना, यह मूल्य अंतिम सेट वहाँ मिलेगा - पिछले चरण में फोर लूप का, और जब आप कॉल भेजते हैं तो मूल्य मौजूद नहीं होता है, जिससे समस्याएं पैदा होती हैं - इसलिए (दिमाग आप, आमतौर पर बहुत उपयोगी) चेतावनी।

+0

इच्छा है कि आपने इस बात को छुआ था कि आप एसिंक कॉलबैक में मूल्य को सही तरीके से कैसे पास करते हैं। – IronSean

5

आप चेतावनी

@RGraham टिप्पणी में उल्लेख किया है, js संकलक संभालने जाता है कि $.grep() को दूसरा पैरामीटर कॉलबैक फ़ंक्शन है क्यों हो रही है और अतुल्यकालिक रूप से क्रियान्वित किया जा रहा है (यह कम से कम क्या यह की तरह लग रही है वाक्य रचनात्मक रूप से)। हालांकि यह सच नहीं है क्योंकि दूसरा फ़ंक्शन वास्तव में फ़िल्टर फ़ंक्शन है। API docs

एक आम तौर पर पाश के लिए एक के अंदर एक async फंक्शन का उपयोग करके चेतावनी Mutable Variable is accessible from closure जब प्राप्त करें। Thats क्योंकि पूरे for loop एक गुंजाइश है। इसका अर्थ प्रत्येक पुनरावृत्ति पर है, आप एक ही चर को कैप्चर करना समाप्त कर देंगे। तो कॉलबैक गलत आईडी प्राप्त करेगा, क्योंकि कॉलबैक कहने से पहले level (म्यूटेबल होने) को बदला जाएगा। सौभाग्य से, मामला आप के साथ :) (क्योंकि $ .grep async नहीं है) काम कर रहे हैं नहीं thats

... तुम अगर यह वास्तव में जिस तरह से मेरी कोड निष्पादित करेंगे प्रभावित करेगा मुझे समझा सकता है?

नहीं, ऐसी चेतावनी आपके कोड के नतीजे को प्रभावित नहीं करेगी।

आप केवल चेतावनी को अनदेखा कर सकते हैं लेकिन यदि आप अभी भी इससे बचना चाहते हैं, तो आप सामग्री को बंद करने के अंदर रख सकते हैं।

for (x = 0; x < levels.length; x++) { 
    (function(){ 
     var level = levels[x]; 
     var candlesOnLevel = $.grep(relevantCandles, function(candles, index) { 
      return parseInt($(candles).css("top").replace(/px/, "")) === level; 
     }); 
    })(); 
} 
संबंधित मुद्दे