2015-07-05 7 views
11

जावास्क्रिप्ट के साथ ब्राउज़र में प्रोग्रामिंग करते समय साइड इफेक्ट्स सीमित करना काफी मुश्किल है।साइड इफेक्ट्स सीमित करना

मैं इस मूर्खतापूर्ण उदाहरण की तरह सदस्य चर तक पहुँचने नहीं की तरह कर सकते हैं:

let number = 0; 

const inc = (n) => { 
    number = number + n; 

    return number; 
}; 

console.log(inc(1)); //=> 1 
console.log(inc(1)); //=> 2 

लेकिन क्या अन्य बातों के मैं अपने जावास्क्रिप्ट में दुष्प्रभाव को कम करने के लिए कर सकते हैं?

+1

जावास्क्रिप्ट में "सदस्य चर" क्या है? – Bergi

+0

मुझे आपका प्रश्न समझ में नहीं आया है। क्या आप पूछ रहे हैं कि कोड को लिखने से पूरी तरह से कैसे रोकें जो साइड इफेक्ट्स का उपयोग करता है, या जेएस में साइड इफेक्ट्स के बिना प्रभावी तरीके से प्रोग्राम कैसे करें? – Bergi

+0

मेरा मतलब है कि मैं साइड इफेक्ट्स को कम कैसे कर सकता हूं। साइड इफेक्ट्स को खत्म करना अव्यवहारिक लगता है लेकिन उनमें से अधिकांश को – dagda1

उत्तर

9

बेशक आप सावधानीपूर्वक प्रोग्रामिंग द्वारा साइड इफेक्ट्स से बच सकते हैं। मुझे लगता है कि आपका प्रश्न को रोकने के बारे में है। ऐसा करने की आपकी क्षमता भाषा की प्रकृति से गंभीर रूप से सीमित है।

  1. उपयोग वेब श्रमिकों: यहाँ कुछ दृष्टिकोण हैं। MDN देखें। वेब श्रमिक एक और वैश्विक संदर्भ में चलते हैं जो वर्तमान विंडो से अलग है .:

  2. iframes के अंदर कुछ प्रकार के तर्क को अलग करें। Iframe के साथ संवाद करने के लिए cross-window messaging का उपयोग करें।

  3. अपरिवर्तनीय पुस्तकालयhttps://github.com/facebook/immutable-js देखें। http://bahmutov.calepin.co/avoid-side-effects-with-immutable-data-structures.html भी।

  4. अपने वस्तुओं Object.freeze, Object.seal, या Object.preventExtensions साथ नीचे लॉक करें। उसी नस में, Object.defineProperty का उपयोग गेटर्स के साथ Object.defineProperty का उपयोग करके ऑब्जेक्ट पर केवल-पढ़ने योग्य गुण बनाएं, लेकिन कोई सेटर्स नहीं, या writeable संपत्ति false पर सेट की गई है।

  5. उपयोग Object.observe वस्तुओं और उनके गुणों, जिस पर आपको एक त्रुटि फेंक या अन्य कार्रवाई कर सकता है में परिवर्तन के विभिन्न प्रकार पर अतुल्यकालिक रिपोर्ट प्राप्त करने के लिए।

  6. यदि उपलब्ध हो, तो किसी ऑब्जेक्ट तक पहुंच पर पूर्ण नियंत्रण के लिए Proxy का उपयोग करें।

window के लिए उपयोग को रोकने पर विचार के लिए, javascript sandbox a module to prevent reference to Window देखते हैं। http://dean.edwards.name/weblog/2006/11/sandbox/ भी। अंत में, Semi-sandboxing Javascript eval

अंदरूनी दुष्प्रभावों और बाहरी दुष्प्रभावों के बीच अंतर करना उपयोगी है। आवक साइड इफेक्ट्स हैं जहां कुछ अन्य कोड मेरे घटक की स्थिति पर घुसपैठ करते हैं। बाहरी दुष्प्रभाव होते हैं जहां मेरा कोड किसी अन्य घटक की स्थिति पर घुसपैठ करता है। अन्य उत्तरों में उल्लिखित IIFE के माध्यम से या ईएस 6 मॉड्यूल द्वारा आंतरिक दुष्प्रभावों को रोका जा सकता है। लेकिन अधिक गंभीर चिंता बाहरी दुष्प्रभाव है, जो ऊपर वर्णित दृष्टिकोणों में से एक की आवश्यकता होगी।

2

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

हालांकि, दो महत्वपूर्ण चालें आप कर सकते हैं:

    "use strict"; साथ अपनी फ़ाइल शुरू
  • । यह आपके कोड की पुष्टि चालू कर देगा और अविकसित चर के उपयोग को रोक देगा। हां, यह एक विशेष स्ट्रिंग है कि ब्राउज़र को पता चलेगा कि कैसे निपटें।
  • आवश्यक होने पर फ़ंक्शन का उपयोग करें। जावास्क्रिप्ट सामान्य स्कॉप्स नहीं कर सकता है, लेकिन कार्यों के लिए यह ठीक काम करता है, इसलिए अपनी मांसपेशियों की स्मृति में (function() { })(); प्राप्त करें।

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

+0

"सामान्य" स्कॉप्स क्या हैं? – zeroflagL

+0

@zeroflagL इमो सामान्य स्कॉप्स, या सिर्फ * सेन स्कॉप्स *, वे स्कोप हैं जो पूरे फ़ंक्शन को नहीं फैलाते हैं, लेकिन केवल उन बयानों के ब्लॉक जिन्हें वे घोषित करते हैं। –

+0

तो क्या आपका मतलब ब्लॉक स्कॉप्स है? – zeroflagL

4

बस क्या मेरे मन में अपने प्रश्न के बारे में सोच करने के लिए कूदता है:

  • वैश्विक नामस्थान अपवित्र न करें। 'Var' या 'let' का प्रयोग करें, वे कीवर्ड आपके चर को स्थानीय दायरे में सीमित करते हैं।

"एक ही नाम के लिए अपने वैश्विक पदचिह्न को कम करके, आप अन्य अनुप्रयोगों, विजेट, या पुस्तकालयों के साथ बुरा बातचीत की संभावना को कम।" - डगलस Crockford

  • उपयोग अर्धविराम
    टिप्पणी अनुभाग of this article कुछ अच्छा (वास्तविक जीवन) कारणों प्रदान करता है हमेशा अर्धविराम उपयोग करने के लिए।

  • घोषित न करें स्ट्रिंग, संख्या या बूलियन ऑब्जेक्ट्स
    (मामले में आप कभी भी करने के लिए परीक्षा रहे थे)

    var m = new Number(2); 
    var n = 2; 
    m === n; // will be false because n is a Number and m is an object 
    
  • "सख्त का उपयोग"; आपका दोस्त है। सख्त मोड सक्षम करने से एक अच्छा विचार है, लेकिन मौजूदा कोड में जोड़ नहीं करते कृपया के बाद से यह कुछ तोड़ सकता है और आप वास्तव में सख्त केवल शाब्दिक स्कोप या अलग-अलग लिपियों as stated here

  • पहले चर घोषित पर नहीं घोषित कर सकते हैं। एक आम दुष्प्रभाव यह है कि लोगों को जावास्क्रिप्ट के होस्टिंग के बारे में पता नहीं है। होस्टिंग आपके ब्लॉक को परिवर्तनीय घोषणा के लिए खोजता है और उन्हें आपके ब्लॉक के शीर्ष पर एक साथ ले जाता है।

    function(){ 
        var x = 3; 
        // visible variables at runtime at this point: x,y,i ! 
    
        // some code.... 
    
        var y = 1; // y will be moved to top! 
        for(var i = 0; i < 10; i++){ // i will be moved to top! 
         // some code... 
        } 
    } 
    

    Here चर्चा की है क्या उत्थापन वास्तव में इसका मतलब है और 'अप्रत्याशित व्यवहार' किस तरह के लिए यह हो सकता है।

  • '==' के बजाय '===' का उपयोग करें। इसके लिए कई अच्छे कारण हैं और यह जावास्क्रिप्ट में सबसे आम 'दुष्प्रभाव' या 'त्रुटियों' में से एक है। अधिक जानकारी के लिए इस great answer on SO देखते हैं, लेकिन मैं आपको एक त्वरित प्रदर्शन दे:

    Iife की
    '' == '0'   // false 
    0 == ''    // true 
    
    // can be avoided by using '===' 
    '' === '0'   // false 
    0 === ''   // false 
    
  • उपयोग करें। एक आईआईएफई (तुरंत आमंत्रित फ़ंक्शन अभिव्यक्ति) आपको एक अनामिक फ़ंक्शन घोषित करने देता है जो स्वयं को कॉल करेगा। इस तरह आप एक नया व्याख्यात्मक दायरा बना सकते हैं और वैश्विक नामस्थान के बारे में चिंता करने की ज़रूरत नहीं है।

  • प्रोटोटाइप के साथ सावधान रहें। ध्यान रखें कि एक ही कक्षा के जावास्क्रिप्ट ऑब्जेक्ट्स समान प्रोटोटाइप साझा करते हैं। प्रोटोटाइप को बदलने का मतलब कक्षा के उदाहरण के सभी के व्यवहार को बदलना है। (यहां तक ​​कि उन अन्य लिपियों/चौखटे द्वारा उपयोग किया जाता है) की तरह यह here

    Object.prototype.foo = function(){...} // careful! 
    

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

+1

हालांकि ये सभी योग्य प्रोग्रामिंग नियम, मैं यह देखने में असफल रहा कि वे ओपी के साइड इफेक्ट्स के बारे में सवाल से कैसे संबंधित हैं, जिसका अर्थ है कि वह शब्द के औपचारिक सीएस/कार्यात्मक प्रोग्रामिंग अर्थ में थे। –

+0

जैसा कि उन्होंने टिप्पणियों में कहा था: "डॉस और डोन की एक सामान्य सूची बहुत अच्छी होगी - dagda1 6 जुलाई 6:54 पर" मैंने अनजान व्यवहार और संघर्षों को छोड़ने के लिए चीजों की एक सूची प्रदान करने/टालने की कोशिश की। मुझे लगता है कि वह यही चाहता था, हालांकि मैं गलत हो सकता था - सवाल थोड़े अस्पष्ट है। आपकी प्रतिक्रिया के लिए आपका धन्यवाद :) –

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