मैं कुछ जावास्क्रिप्ट किताबें पढ़ रहा हूं और मैं हमेशा बंद होने और दुष्प्रभावों के बारे में सुनता हूं। किसी कारण से मैं समझ नहीं पा रहा हूं कि वे वास्तव में क्या हैं। क्या कोई मुझे समझा सकता है कि वे सादे अंग्रेजी और उदाहरणों में क्या हैं? (जैसा कि आप किसी ग्राफिक डिजाइनर के प्रोग्रामिंग स्तर वाले किसी व्यक्ति को समझा रहे थे)।सादा अंग्रेजी में जावास्क्रिप्ट बंद और साइड इफेक्ट्स? (अलग से)
उत्तर
दुष्प्रभाव जारी रखने के लिए आसान अवधारणा है। एक "शुद्ध कार्य" एक ऐसा फ़ंक्शन है जो इसके इनपुट मान को आउटपुट मान def plus(x, y){ return x + y; }
में मानचित्र करता है। एक "दुष्प्रभाव" उस वापसी मूल्य के अलावा कोई प्रभाव है। तो, उदाहरण के लिए:
def plusWithSideEffects(x, y) { alert("This is a side effect"); return x + y; }
पर एक अलर्ट संवाद (और उपयोगकर्ता इंटरैक्शन की आवश्यकता है) को बढ़ाने का दुष्प्रभाव है। प्रत्येक कोड फ़ंक्शन में कुछ साइड इफेक्ट्स (वे सभी स्मृति का उपभोग करते हैं और समय लेते हैं, अगर कुछ और नहीं), लेकिन जब लोग साइड इफेक्ट्स के बारे में बात करते हैं, तो वे अक्सर आईओ (उपरोक्त चेतावनी संवाद की तरह) या लेखन के बारे में अधिक चिंतित होते हैं राज्य जो कार्य की निष्पादन अवधि से परे रहता है।
साइड इफेक्ट्स के साथ चुनौती यह है कि वे कार्य करने और पुन: उपयोग करने के लिए कठिन परिश्रम करते हैं। (यह कारण और पुन: उपयोग कार्यों के लिए है कि के रूप में पास करने के लिए "शुद्ध कार्यों" संभव के रूप में कर रहे हैं, क्योंकि वे करते हैं बहुत आसान है "एक बात अच्छी तरह से करते हैं।")
"ग्राफिक डिजाइनर के प्रोग्रामिंग स्तर" के लिए यह एक वास्तविक उत्तर है। –
मैं इसे वोट नहीं दे रहा हूं क्योंकि उत्तर प्रश्न का उत्तर देता है, लेकिन, मुझे उदाहरण में इस्तेमाल किए गए डीफ़ कीवर्ड को पसंद नहीं है क्योंकि यह जावास्क्रिप्ट आरक्षित शब्द नहीं है, यह एक अजगर चीज है ना? – zappa
उदाहरण
function outer() {
var outerVar;
var func = function() {
var innerVar
...
x = innerVar + outerVar
}
return func
}
जब बाहरी() मर जाते हैं, समारोह समारोह() livе और इस प्रयोग के व्यावहारिक
पक्ष प्रभाव:
एक पक्ष की Think दो चीजें एक बार में प्रभाव के रूप में प्रभाव। उदाहरण के लिए:
एक पक्ष प्रभाव की क्लासिक उदाहरण:
var i = 1;
var j = i++;
पक्ष प्रभाव i++
में क्या होता है। j
यहां होता है 1 और फिरi
वृद्धि हो जाता हो जाता है और दूसरे शब्दों में 2. हो जाता है, दो बातें हुआ है और पक्ष प्रभाव है कि i
बन 2.
बंद था:
की एक श्रृंखला कल्पना इस तरह के लिंक: <> <> <> <> <> <> <>। कल्पना कीजिए कि लिंक की इस श्रृंखला का नाम स्कोप चेन कहा जाता है। फिर कल्पना करें कि ये सभी लिंक ऑब्जेक्ट्स को इस तरह से कनेक्ट करते हैं: <> ऑब्जेक्ट <> ऑब्जेक्ट <> ऑब्जेक्ट <>। अब, निम्न को ध्यान में रखें:
(1) सभी स्कोप चेन वैश्विक ऑब्जेक्ट से शुरू होते हैं।
(2) जब कोई फ़ंक्शन परिभाषित किया जाता है, तो उस फ़ंक्शन के लिए एक स्कोप श्रृंखला संग्रहीत होती है।
(3) जब एक समारोह शुरू हो जाती है, यह एक नई वस्तु बनाता है और गुंजाइश श्रृंखला है कि कहते हैं।
अब, निम्न उदाहरण को देखो कृपया:
function counter() { // define counter
var count = 0;
return function() { return count + 1;}; // define anonymous function
};
var count = counter(); // invoke counter
इस उदाहरण में, जब counter()
परिभाषित किया गया है, काउंटर के लिए गुंजाइश श्रृंखला इस तरह दिखता है: <> वैश्विक वस्तु <>। फिर, जब counter()
लागू किया जाता है, तो स्कोप श्रृंखला इस तरह दिखती है: <> वैश्विक वस्तु <> काउंटर ऑब्जेक्ट <>। उसके बाद, काउंटर के अंदर कोई नाम (अज्ञात फ़ंक्शन कहा जाता है) वाला फ़ंक्शन परिभाषित और बुलाया जाता है। गुमनाम समारोह के लिए गुंजाइश श्रृंखला एक बार इस तरह दिखता है अनुरोध किया गया:। <> वैश्विक वस्तु <> काउंटर वस्तु <> गुमनाम समारोह वस्तु <>
यहाँ रहे थे बंद हिस्से में आता है अगर आप देखते हैं, अनाम समारोह उपयोग कर रहा है परिवर्तनीय count
जिसे इसके बाहर परिभाषित किया गया था। इसका कारण यह है कि अज्ञात फ़ंक्शन अपनी स्कोप श्रृंखला में परिभाषित किसी भी चर का उपयोग कर सकता है। यह एक बंद है, एक संग्रहीत स्कोप श्रृंखला में किसी भी चर के संदर्भ के साथ एक समारोह है।
हालांकि, ऊपर के उदाहरण में, एक बार कार्यों लौटने के लिए, मंगलाचरण पर बनाया वस्तुओं छोड़ दिए जाते हैं तो वहाँ वास्तव में कोई मतलब नहीं है। अब निम्नलिखित को देखो: इस उदाहरण में
function counter() { // define counter
var count = 0;
function f() { return count + 1;}; // define f
return f; // return f
};
var count = counter(); // invoke counter
, मैं f
नामित और चर count
है कि आवंटित एक समारोह लौटने कर रहा हूँ। अब परिवर्तनीय count
पूरे स्कोप श्रृंखला का संदर्भ रखता है और इसे त्याग दिया नहीं जाता है। दूसरे शब्दों में परिवर्तनीय गिनती इस प्रकार स्कोप चेन को स्टोर करती है: <> वैश्विक वस्तु <> काउंटर ऑब्जेक्ट <> अज्ञात फ़ंक्शन ऑब्जेक्ट <>। यह बंद करने की शक्ति है, आप एक स्कोप श्रृंखला का संदर्भ रख सकते हैं, और इसे इस तरह कहते हैं: count()
। दुष्प्रभावों के साथ
** इस उत्तर का बंद हिस्सा गलत है **। जावास्क्रिप्ट में * स्थिर दायरा * है, जिसका अर्थ है कि फ़ंक्शन की स्कोप श्रृंखला फ़ंक्शन * परिभाषा *, ** ** ** फ़ंक्शन * आमंत्रण * पर परिभाषित नहीं है। उदाहरण काम करता है क्योंकि अज्ञात फ़ंक्शन प्रत्येक बार 'काउंटर' का आह्वान किया जाता है, जिसका अर्थ है कि प्रत्येक लौटाए गए फ़ंक्शन में 'काउंटर' के लिए एक अलग * सक्रियण ऑब्जेक्ट * के साथ एक स्कोप श्रृंखला होगी, और इस प्रकार स्थानीय चर के एक अलग सेट (जैसे कि 'count')। [अधिक जानकारी के लिए यह उत्तर देखें।] (Http://stackoverflow.com/questions/7721200/using-javascript-closures-in-settimeout/7722057#7722057) – josh3736
@ josh3736: टिप्पणी के लिए धन्यवाद। मैंने अपना जवाब बदल दिया, कृपया सलाह दें कि कुछ भी गलत है या नहीं। साथ ही, मैं यह टिप्पणी करना चाहता था कि, वैश्विक कार्य घोषणा के लिए, फ़ंक्शन में केवल एक स्कोप श्रृंखला का संदर्भ होगा जिसमें वैश्विक वस्तु शामिल है। जब तक आप इसका आह्वान नहीं करेंगे तब तक यह सक्रियण ऑब्जेक्ट का संदर्भ नहीं देगा। –
कार्य एक मूल्य (वे ऐसा कर सकते हैं कि रूप में अच्छी तरह हालांकि) लौटने के अलावा कुछ करते हैं। यदि आप उन तर्कों के मूल्य के साथ दिए गए तर्कों के लिए सभी फ़ंक्शन कॉल को प्रतिस्थापित कर सकते हैं और प्रोग्राम का एक ही व्यवहार है, तो कोई दुष्प्रभाव नहीं हैं। यह आवश्यक है कि फ़ंक्शन हमेशा दिए गए तर्कों के लिए समान मान लौटाए।
है, f(1,2) == 12
लगता है। यदि आप f(1,2)
को 12
के साथ हमेशा बदल सकते हैं और प्रोग्राम उसी तरह से व्यवहार करता है, तो f
के उन तर्कों के लिए कोई दुष्प्रभाव नहीं है। दूसरी तरफ, यदि एक स्थान पर f(1,2) == 12
और अन्य f(1,2) == 13
, तो f
के दुष्प्रभाव हैं। इसी प्रकार, यदि कार्यक्रम f(1,2)
को 12 के साथ बदलने के बाद एक ईमेल भेजना बंद कर दिया, तो f
के दुष्प्रभाव हैं। आम तौर पर, यदि f(x,y) == z
(जहां z एक्स और वाई पर निर्भर करता है) और आप हमेशा z
के साथ कॉल को प्रतिस्थापित कर सकते हैं, तो f
का कोई दुष्प्रभाव नहीं है।
दुष्प्रभावों के साथ कुछ सरल कार्य:
// doesn't always return the same value
function counter() {
// globals are bad
return ++x;
}
// omitting calls to `say` change logging behavior
function say(x) {
console.log(x);
return x;
}
मैं जावास्क्रिप्ट के लिए नया हूँ, और बंद होने की बात करने के लिए कोशिश नहीं करेंगे। हालांकि जावास्क्रिप्ट के लिए मेरी नईता मुझे साइड इफेक्ट के उपयोग के बारे में काफी जानकारी देती है जो मेरी सामान्य प्रोग्रामिंग भाषा (एरलांग) में असंभव है।
साइड इफेक्ट्स जावास्क्रिप्ट में राज्य को बदलने का एक सामान्य तरीका प्रतीत होता है। w3cschools.com वेबसाइट से इस उदाहरण उदाहरण के लिए ले लो:
<script>
function myFunction() {
document.getElementById("demo").innerHTML = "Paragraph changed.";
}
</script>
यहाँ कोई इनपुट पैरामीटर या वापसी मान, बजाय दस्तावेज़ की सामग्री के रूप में वे कार्य करने के लिए दायरे में वैश्विक हैं बदल जाओ। यदि आप इसे उदाहरण के लिए एर्लांग में लिखना चाहते थे, तो दस्तावेज़ को पैरामीटर के रूप में पास किया जाएगा, और नया दस्तावेज़ स्थिति वापस कर दी जाएगी। कॉलिंग प्रोग्राम पढ़ने वाले व्यक्ति को एक दस्तावेज़ पारित किया जाएगा और एक बदले गए दस्तावेज़ को वापस किया जा रहा है।
स्पष्ट नए राज्य को वापस न करने के लिए कहा जाता है कि कार्यों को देखकर प्रोग्रामर को दुष्प्रभावों के संभावित उपयोग के लिए सतर्क होना चाहिए।
- 1. पिरामिड संसाधन: सादा अंग्रेजी में
- 2. कार्यात्मक प्रोग्रामिंग: साइड इफेक्ट्स
- 3. टास्क LongRunning साइड इफेक्ट्स?
- 4. LINQ साइड इफेक्ट्स
- 5. कीवर्ड 'नया' जावास्क्रिप्ट में क्या साइड इफेक्ट्स करता है?
- 6. नेस्टेड फ़ंक्शंस: साइड इफेक्ट्स का अयोग्य उपयोग?
- 7. सी ++ में साइड इफेक्ट्स और अवलोकन योग्य व्यवहार कैसे हैं?
- 8. साइड इफेक्ट्स के साथ यूनिट परीक्षण फ़ंक्शन?
- 9. क्या हास्केल आयातों के साइड इफेक्ट्स हैं?
- 10. सादा जावास्क्रिप्ट
- 11. सादा जावास्क्रिप्ट
- 12. क्लोजर - ऑर्डर से बाहर होने वाले साइड इफेक्ट्स
- 13. एक पुनरावर्तक में साइड इफेक्ट्स हानिकारक माना जाता है?
- 14. जावास्क्रिप्ट कन्स्ट्रक्टर में साइड इफेक्ट्स खराब अभ्यास का उपयोग क्यों कर रहा है?
- 15. jQuery या सादा जावास्क्रिप्ट
- 16. जावास्क्रिप्ट में "" और "अलग-अलग अर्थ हैं?
- 17. सी ++ 11 साइड इफेक्ट्स के साथ 11 चालक कन्स्ट्रक्टर
- 18. जब किसी विधि के साइड इफेक्ट्स होते हैं?
- 19. जावास्क्रिप्ट प्रोटोटाइप और बंद
- 20. पोजिशनिंग नोड्स के साथ `{रैंक = एक ही ...}` साइड इफेक्ट्स
- 21. सी ++: कोई साइड इफेक्ट्स के साथ फ़ंक्शन अनुकूलित करना
- 22. असेंबली कॉल करने के साइड इफेक्ट्स। कई बार लोड करें
- 23. जावास्क्रिप्ट बंद और नाम clobbering
- 24. माउस का पता लगाने के बिना जावास्क्रिप्ट के साथ जावा पर क्लिक करें साइड इफेक्ट्स
- 25. क्या कोई सादा अंग्रेजी में ओआरए -29861 त्रुटि और इसके संभावित कारण को समझा सकता है?
- 26. हाइब्रिड सर्वर-साइड-जावा और क्लाइंट-साइड-जावास्क्रिप्ट चार्टिंग लाइब्रेरी?
- 27. सादा जावास्क्रिप्ट बिडरेक्शनल डेटा बाध्यकारी
- 28. सादा वस्तुओं कास्टिंग सर्वर प्रतिक्रिया जावास्क्रिप्ट में
- 29. ओओपी में साइड इफेक्ट्स और स्टेटस से बचने के तरीके सीखने के लिए सबसे अच्छे संसाधन क्या हैं?
- 30. जावास्क्रिप्ट MVC फ़्रेमवर्क और सर्वर साइड फ़्रेमवर्क
कृपया स्पष्ट करें: क्या आप साइड इफेक्ट्स के स्पष्टीकरण के लिए बंद होने और अलग-अलग के लिए स्पष्टीकरण मांग रहे हैं? या दोनों संयुक्त के बारे में? – delnan
@ डेलन क्षमा करें मैंने शीर्षक को संशोधित किया। – alexchenco
फिर http://stackoverflow.com/questions/111102/how-do-javascript-closures-work देखें और बंद करें भाग को हटा दें, यह एक डुप्लिकेट होगा। साइड इफेक्ट्स बिल्कुल बिल्कुल नए नहीं हैं, लेकिन मुझे एसओ पर विशिष्ट कुछ भी पता नहीं है, इसलिए मैं अभी बंद करने के लिए मतदान नहीं कर रहा हूं। – delnan