2011-11-14 14 views
10

मैं कुछ जावास्क्रिप्ट किताबें पढ़ रहा हूं और मैं हमेशा बंद होने और दुष्प्रभावों के बारे में सुनता हूं। किसी कारण से मैं समझ नहीं पा रहा हूं कि वे वास्तव में क्या हैं। क्या कोई मुझे समझा सकता है कि वे सादे अंग्रेजी और उदाहरणों में क्या हैं? (जैसा कि आप किसी ग्राफिक डिजाइनर के प्रोग्रामिंग स्तर वाले किसी व्यक्ति को समझा रहे थे)।सादा अंग्रेजी में जावास्क्रिप्ट बंद और साइड इफेक्ट्स? (अलग से)

+0

कृपया स्पष्ट करें: क्या आप साइड इफेक्ट्स के स्पष्टीकरण के लिए बंद होने और अलग-अलग के लिए स्पष्टीकरण मांग रहे हैं? या दोनों संयुक्त के बारे में? – delnan

+0

@ डेलन क्षमा करें मैंने शीर्षक को संशोधित किया। – alexchenco

+1

फिर http://stackoverflow.com/questions/111102/how-do-javascript-closures-work देखें और बंद करें भाग को हटा दें, यह एक डुप्लिकेट होगा। साइड इफेक्ट्स बिल्कुल बिल्कुल नए नहीं हैं, लेकिन मुझे एसओ पर विशिष्ट कुछ भी पता नहीं है, इसलिए मैं अभी बंद करने के लिए मतदान नहीं कर रहा हूं। – delnan

उत्तर

12

दुष्प्रभाव जारी रखने के लिए आसान अवधारणा है। एक "शुद्ध कार्य" एक ऐसा फ़ंक्शन है जो इसके इनपुट मान को आउटपुट मान def plus(x, y){ return x + y; } में मानचित्र करता है। एक "दुष्प्रभाव" उस वापसी मूल्य के अलावा कोई प्रभाव है। तो, उदाहरण के लिए:

def plusWithSideEffects(x, y) { alert("This is a side effect"); return x + y; } 

पर एक अलर्ट संवाद (और उपयोगकर्ता इंटरैक्शन की आवश्यकता है) को बढ़ाने का दुष्प्रभाव है। प्रत्येक कोड फ़ंक्शन में कुछ साइड इफेक्ट्स (वे सभी स्मृति का उपभोग करते हैं और समय लेते हैं, अगर कुछ और नहीं), लेकिन जब लोग साइड इफेक्ट्स के बारे में बात करते हैं, तो वे अक्सर आईओ (उपरोक्त चेतावनी संवाद की तरह) या लेखन के बारे में अधिक चिंतित होते हैं राज्य जो कार्य की निष्पादन अवधि से परे रहता है।

साइड इफेक्ट्स के साथ चुनौती यह है कि वे कार्य करने और पुन: उपयोग करने के लिए कठिन परिश्रम करते हैं। (यह कारण और पुन: उपयोग कार्यों के लिए है कि के रूप में पास करने के लिए "शुद्ध कार्यों" संभव के रूप में कर रहे हैं, क्योंकि वे करते हैं बहुत आसान है "एक बात अच्छी तरह से करते हैं।")

+1

"ग्राफिक डिजाइनर के प्रोग्रामिंग स्तर" के लिए यह एक वास्तविक उत्तर है। –

+0

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

0

उदाहरण

function outer() { 
    var outerVar; 

    var func = function() { 
     var innerVar 
     ... 
     x = innerVar + outerVar 
    } 
    return func 
} 

जब बाहरी() मर जाते हैं, समारोह समारोह() livе और इस प्रयोग के व्यावहारिक

2

पक्ष प्रभाव:

एक पक्ष की 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()। दुष्प्रभावों के साथ

+1

** इस उत्तर का बंद हिस्सा गलत है **। जावास्क्रिप्ट में * स्थिर दायरा * है, जिसका अर्थ है कि फ़ंक्शन की स्कोप श्रृंखला फ़ंक्शन * परिभाषा *, ** ** ** फ़ंक्शन * आमंत्रण * पर परिभाषित नहीं है। उदाहरण काम करता है क्योंकि अज्ञात फ़ंक्शन प्रत्येक बार 'काउंटर' का आह्वान किया जाता है, जिसका अर्थ है कि प्रत्येक लौटाए गए फ़ंक्शन में 'काउंटर' के लिए एक अलग * सक्रियण ऑब्जेक्ट * के साथ एक स्कोप श्रृंखला होगी, और इस प्रकार स्थानीय चर के एक अलग सेट (जैसे कि 'count')। [अधिक जानकारी के लिए यह उत्तर देखें।] (Http://stackoverflow.com/questions/7721200/using-javascript-closures-in-settimeout/7722057#7722057) – josh3736

+0

@ josh3736: टिप्पणी के लिए धन्यवाद। मैंने अपना जवाब बदल दिया, कृपया सलाह दें कि कुछ भी गलत है या नहीं। साथ ही, मैं यह टिप्पणी करना चाहता था कि, वैश्विक कार्य घोषणा के लिए, फ़ंक्शन में केवल एक स्कोप श्रृंखला का संदर्भ होगा जिसमें वैश्विक वस्तु शामिल है। जब तक आप इसका आह्वान नहीं करेंगे तब तक यह सक्रियण ऑब्जेक्ट का संदर्भ नहीं देगा। –

4

कार्य एक मूल्य (वे ऐसा कर सकते हैं कि रूप में अच्छी तरह हालांकि) लौटने के अलावा कुछ करते हैं। यदि आप उन तर्कों के मूल्य के साथ दिए गए तर्कों के लिए सभी फ़ंक्शन कॉल को प्रतिस्थापित कर सकते हैं और प्रोग्राम का एक ही व्यवहार है, तो कोई दुष्प्रभाव नहीं हैं। यह आवश्यक है कि फ़ंक्शन हमेशा दिए गए तर्कों के लिए समान मान लौटाए।

है, 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; 
} 
0

मैं जावास्क्रिप्ट के लिए नया हूँ, और बंद होने की बात करने के लिए कोशिश नहीं करेंगे। हालांकि जावास्क्रिप्ट के लिए मेरी नईता मुझे साइड इफेक्ट के उपयोग के बारे में काफी जानकारी देती है जो मेरी सामान्य प्रोग्रामिंग भाषा (एरलांग) में असंभव है।

साइड इफेक्ट्स जावास्क्रिप्ट में राज्य को बदलने का एक सामान्य तरीका प्रतीत होता है। w3cschools.com वेबसाइट से इस उदाहरण उदाहरण के लिए ले लो:

<script> 
function myFunction() { 
    document.getElementById("demo").innerHTML = "Paragraph changed."; 
} 
</script> 

यहाँ कोई इनपुट पैरामीटर या वापसी मान, बजाय दस्तावेज़ की सामग्री के रूप में वे कार्य करने के लिए दायरे में वैश्विक हैं बदल जाओ। यदि आप इसे उदाहरण के लिए एर्लांग में लिखना चाहते थे, तो दस्तावेज़ को पैरामीटर के रूप में पास किया जाएगा, और नया दस्तावेज़ स्थिति वापस कर दी जाएगी। कॉलिंग प्रोग्राम पढ़ने वाले व्यक्ति को एक दस्तावेज़ पारित किया जाएगा और एक बदले गए दस्तावेज़ को वापस किया जा रहा है।

स्पष्ट नए राज्य को वापस न करने के लिए कहा जाता है कि कार्यों को देखकर प्रोग्रामर को दुष्प्रभावों के संभावित उपयोग के लिए सतर्क होना चाहिए।

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