2015-05-18 10 views
19

मैं जो करना चाहता हूं वह जितना संभव हो उतना अपरिवर्तनीय चर का उपयोग करना है, इस प्रकार मेरे कोड में चलती भागों की संख्या को कम करना। मैं केवल "var" और "let" का उपयोग करना चाहता हूं जब यह आवश्यक हो।जावास्क्रिप्ट में फ़ंक्शन पैरामीटर निरंतर कैसे बनाएं?

यह काम नहीं करेगा:

function constParam(const a){ 
    alert('You want me to '+a+'!'); 
} 

कोई भी विचार?

उत्तर

21

फ़ंक्शन पैरामीटर ईएस 6 में म्यूटेबल बाइंडिंग (जैसे var) रहेगा, इसके खिलाफ आप कुछ भी नहीं कर सकते हैं। शायद सबसे अच्छा समाधान आप प्राप्त एक const initialisation में arguments object destructure के लिए है:

function hasConstantParameters(const a, const b, const c, …) { // not possible 
    … 
}
function hasConstantParameters() { 
    const [a, b, c, …] = arguments; 
    … 
} 

सूचना है कि इस समारोह, अगर आप की जरूरत है कि आप कुछ घोषित करने के लिए होगा एक अलग arity (.length) होगा प्लेसहोल्डर पैरामीटर।

बजाय::

function F(const a, const b, const c, const d, const e, const f, const g){ // Invalid Code 
    // lorem 
    // ipsum 
} 

..Use:

+6

यह वास्तव में इसके लिए एक दिलचस्प समाधान है। यदि यह इतना बदसूरत नहीं था, तो मैं इसका उपयोग करना शुरू कर दूंगा। –

+0

'फ़ंक्शन के बारे में कॉन्स्टेंट पैरामीटर (... तर्क) {const [a, b] = args; }; '? –

+0

@ बुग्सबनी यह काफी समान है। हालांकि, मुझे किसी अन्य पहचानकर्ता ('args') की शुरूआत पसंद नहीं है, और मैंने जानबूझकर सामान्य स्थान पर कोई पैरामीटर नहीं डाला लेकिन सब कुछ' कॉन्स्ट 'घोषणा में ले जाया गया। – Bergi

0

जावास्क्रिप्ट में अपरिवर्तनीय होने के लिए पैरामीटर को मजबूर करने का कोई तरीका नहीं है। आपको खुद का ट्रैक रखना होगा।

बस एक ऐसी शैली में लिखें जहां आप चर को म्यूट नहीं करना चाहते हैं। तथ्य यह है कि भाषा बल पर कोई सुविधा प्रदान नहीं करती है, इसका मतलब यह नहीं है कि आप इसे अभी भी नहीं कर सकते हैं।

+0

वहाँ ES6 के साथ है। –

+3

@QuentinRoy संदर्भ? Es6 निरंतर मान घोषित करने के तरीके प्रदान करता है, लेकिन निरंतर के रूप में * फ़ंक्शन पैरामीटर * घोषित करने का कोई तरीका नहीं है। आप "फ़ंक्शन() {const a = ...; ...}" लिख सकते हैं, लेकिन आप "फ़ंक्शन (कॉन्स ए) {...}" नहीं लिख सकते हैं। –

+0

आपको खेद है कि मैं तेज़ी से पढ़ता हूं। मैंने सोचा कि आप पैरामीटर के बजाय परिवर्तनीय के बारे में बात कर रहे थे। –

-2

सबसे पहले, जेएस में कोई स्थिरांक नहीं है (ईसीएमएस्क्रिप्ट 6 प्रस्ताव तक)। ऐसा कुछ बनाने के लिए आपको var का उपयोग करना होगा। यदि आप अपने जेएस कोड में "निजी" क्षेत्र रखना चाहते हैं, तो आप भाषा की विशेषताओं में से एक का उपयोग करते हैं, जो स्कॉप्स हैं।

तो, उदा, इस तरह जाना:

var kindaConstant = function(){ 
    var donttouchthis 
    ... do something with it 
    return whateveryouvedonewithit 
} 

इस मामले donttouchthis में है कि आसानी से "बाहर" से परिवर्तनशील नहीं है।

+0

कॉन्स्टेंट जावास्क्रिप्ट में मौजूद हैं और आधुनिक ब्राउज़र द्वारा समर्थित हैं: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/const –

+0

आप लिंक शब्द से शुरू होते हैं "यह है एक प्रयोगात्मक तकनीक, "... यह सच है, कि कुछ ब्राउज़र समर्थन स्थिरांक। आपको एक परियोजना के लिए भाग्यशाली काम करना चाहिए, जो आपको ब्राउज़र चुनने देता है ... ;-) –

+0

यह अब प्रयोगात्मक नहीं है – Xenos

8

आप पैरामीटर const नहीं बना सकते हैं। एक स्थानीय चर का प्रारंभिक मूल्य के रूप में यह प्रयोग करें:

function constParam(a) { 
    const const_a = a; 
    ... 
} 

भी ध्यान रखें कि const केवल IE11 के रूप में इंटरनेट एक्सप्लोरर में समर्थित है। यह compatibility table

-1

अपरिवर्तनीय संरचनाओं के लिए मुझे विश्वास है कि आप Immutable.js देख रहे हैं।


@Andreas_Gnyp के रूप में कह रहा है, ES6 तक वहां जावास्क्रिप्ट में कोई let/const है। (न ही function(const a) {...} होगा जब ES6 बाहर हो और पूरी तरह से समर्थित हो।) यदि आप const का उपयोग करना चाहते हैं, तो आप या तो अपनी const सुविधा लागू कर सकते हैं, या कुछ तृतीय पक्ष ES6-to-ES5 कंपाइलर की सहायता से ES6 नोटेशन का उपयोग शुरू कर सकते हैं, Babel के रूप में।

हालांकि, ध्यान रखें कि const ES6 नोटेशन में परिवर्तनीय अपरिवर्तनीय नहीं है। जैसे const a = [1, 2]; a.push(3); एक पूरी तरह से वैध प्रोग्राम है और a[1, 2, 3] बन जाएगा। constकेवल आपको a को पुन: असाइन करने से रोकता है, ताकि आप a = [] या a = {} या जो भी const a = [1, 2]; पहले से परिभाषित (उस विशेष दायरे में) को पहले से परिभाषित नहीं कर सकें।

function hasConstantParameters(...args) { 
    const [a, b] = args; 
} 

Immutable.js सुनिश्चित करें कि, जब आप var a = fromJS([1, 2]); को परिभाषित करने और प्राप्त समारोह a.push(3) में एक समारोह पैरामीटर के रूप में a गुजरती हैं, a को प्रभावित नहीं करेगा कर देगा। क्या आप यही हासिल करना चाहते हैं?

+3

इस उत्तर में मेरे प्रश्न के साथ कुछ लेना देना नहीं है। मैंने कक्षा के सदस्यों की गोपनीयता के बारे में निरंतर मानकों के बारे में पूछा। – shal

+1

सच है, मुझे अपना जवाब दोबारा करने दो। –

1

यह मैं क्या कर रहा है

function F(){const[a, b, c, d, e, f, g] = arguments; 
    // lorem 
    // ipsum 
} 
+1

यह स्पष्टीकरण के बिना बर्गी का उत्तर है। – faintsignal

0
function wrapper(i){ 
    const C=i 
    return new Function("a","b", "return a+b+"+C)  
} 

f100 = wrapper(100) //ƒ anonymous(a,b/*``*/) {return a+b+100} 
f100(1,2) //OUTPUT 103 

f200 = wrapper(200) //ƒ anonymous(a,b/*``*/) {return a+b+200} 
f200(1,2) //OUTPUT 203 
संबंधित मुद्दे