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


183

मुझे दिलचस्पी है कि constजावास्क्रिप्ट में किसी विशेष प्रकार के मूल्यों का उपयोग करने के लिए किसी भी सीमा को निर्धारित किया जा सकता है। क्या यह मान्य है? दी यह काम करता है, लेकिन क्या यह किसी भी कारण से बुरा माना जाता है?

const doSomething = () => {
   ...
}

क्या सभी कार्यों को ईएस 6 में इस तरह परिभाषित किया जाना चाहिए? ऐसा नहीं लगता कि इस पर पकड़ा गया है, यदि ऐसा है।

किसी भी टिप्पणी के लिए धन्यवाद!


आप कई प्रश्न पूछते हैं: 1) "मुझे दिलचस्पी है अगर जावास्क्रिप्ट में संख्‍या का उपयोग करके किस प्रकार के मान निर्धारित किए जा सकते हैं" 2 नंबर "क्या यह वैध है?" हाँ। 3) "क्या यह किसी भी कारण से बुरा व्यवहार माना जाता है" मुझे लगता है कि इसके बारे में कुछ भी कहने के लिए यह काफी समय से नहीं है, लेकिन मैं यह नहीं देखता कि यह पैड अभ्यास क्यों होना चाहिए। यह बहुत अलग नहीं है var doSomething = <function def>;। 4) "क्या सभी कार्यों को ईएस 6 में इस तरह परिभाषित किया जाना चाहिए?" मुझे बोझिल लगता है। मुझे फंक्शन डिक्लेरेशन पसंद है। सबका अपना।
फेलिक्स क्लिंग

1
जिस तरह से मैं इसे देखता हूं (राय, एक तथ्य नहीं), यह समझ में आता है कि क्या आप पुनर्परिभाषित कार्यों को अस्वीकार करना चाहते हैं। चाहे वह समझदार हो, या चाहे उसका कोई कार्यात्मक उपयोग हो - यह बहस का मुद्दा है। अगर आपको लगता है कि यह आपके उपयोग परिदृश्य पर फिट बैठता है, तो मुझे नहीं लगता कि कोई आपके निर्णय पर बहस कर सकता है और इसे बुरा व्यवहार बता सकता है।
Mjh

4
मुझे लगता है कि सवाल यह है कि आप क्या हासिल करना चाहते हैं const। क्या आप फ़ंक्शन को ओवरराइड करने से रोकना चाहते हैं? मुझे लगता है कि आप अपने कोड को वैसे भी ऐसा नहीं करने के लिए जानते हैं। क्या आप इसका आशय व्यक्त करना चाहते हैं doSomething, अर्थात यह एक फ़ंक्शन रखता है और इसका मूल्य नहीं बदलता है? मुझे लगता है कि समारोह घोषणाएँ इस आशय को स्पष्ट रूप से बताती हैं। इसलिए, यदि आपको ओवरराइडिंग से "रनटाइम सुरक्षा" की आवश्यकता है, तो इसके लिए जाएं। अन्यथा मुझे ज्यादा फायदा नहीं दिख रहा है। यदि आप मुख्य रूप से उपयोग var foo = function() {};करना चाहते हैं, तो मैं constइसके बजाय उपयोग करूंगा var
फेलिक्स क्लिंग

5
@FelixKling, "मुझे लगता है कि आप अपने कोड को वैसे भी ऐसा नहीं करने के लिए जानते हैं।" - यह बहुत बुरा तर्क है। अन्यथा, वहाँ कोई मतलब नहीं है const
मेन्ड्रे

जवाबों:


254

आपके द्वारा किए गए कार्यों से कोई समस्या नहीं है, लेकिन आपको फ़ंक्शन घोषणाओं और फ़ंक्शन अभिव्यक्तियों के बीच का अंतर याद रखना चाहिए।

एक फ़ंक्शन घोषणा, जो है:

function doSomething () {}

पूरी तरह से दायरे के शीर्ष पर फहराया जाता है (और पसंद है letऔर constवे ब्लॉक स्कूप्ड भी हैं)।

इसका मतलब है कि निम्नलिखित काम करेगा:

doSomething() // works!
function doSomething() {}

एक फ़ंक्शन अभिव्यक्ति, जो है:

[const | let | var] = function () {} (or () =>

एक अनाम फ़ंक्शन ( function () {}) और एक चर का निर्माण है, और फिर उस चर के लिए उस अनाम फ़ंक्शन का असाइनमेंट है।

तो एक दायरे के भीतर परिवर्तनशील होर्डिंग के आस-पास के सामान्य नियम - ब्लॉक-स्कोप किए गए चर ( letऔर const) undefinedअपने ब्लॉक स्कोप के शीर्ष पर नहीं फहराते हैं ।

इसका मतलब है की:

if (true) {
    doSomething() // will fail
    const doSomething = function () {}
}

doSomethingपरिभाषित नहीं होने के बाद से विफल हो जाएगा । (यह फेंक देंगे ReferenceError)

यदि आप उपयोग करके स्विच करते हैं, varतो आपको वेरिएबल की अपनी उत्थापन प्राप्त होती है, लेकिन इसे प्रारंभ किया जाएगा undefinedताकि ऊपर दिए गए कोड का ब्लॉक अभी भी काम न करे। (यह एक फेंक जाएगा TypeErrorके बाद से doSomethingबार जब आप इसे फोन में आयोजित एक समारोह नहीं है)

जहां तक ​​मानक प्रथाओं की बात है, आपको हमेशा नौकरी के लिए उचित उपकरण का उपयोग करना चाहिए।

Axel Rauschmayer के दायरे में बहुत बढ़िया पोस्ट है और इसमें es6 शब्दार्थ शामिल हैं: ES6 में वेरिएबल्स और स्कूपिंग


7
कक्षा के नाम को पुन: असाइन किए जाने से बचाने के लिए आंतरिक रूप से कास्ट 6 का उपयोग करता है।
user2342460

2
function a(){console.log(this);} और बी के बीच एक सूक्ष्म अंतर const a=_=>{console.log(this);}यह है कि अगर आप इसे कहते हैं a.call(someVar);, जैसे , ए में , यह प्रिंट करेगा someVar, बी में , यह प्रिंट करेगा window
कियान चेन

100

यद्यपि constपरिभाषित कार्यों का उपयोग करना हैक की तरह लगता है, लेकिन यह कुछ महान फायदे के साथ आता है जो इसे बेहतर बनाते हैं (मेरी राय में)

  1. यह फ़ंक्शन को अपरिवर्तनीय बनाता है, इसलिए आपको कोड के किसी अन्य टुकड़े द्वारा उस फ़ंक्शन को बदलने की चिंता करने की आवश्यकता नहीं है।

  2. आप वसा तीर सिंटैक्स का उपयोग कर सकते हैं, जो छोटा और क्लीनर है।

  3. एरो फ़ंक्शंस का उपयोग करना thisआपके लिए बाध्यकारी का ख्याल रखता है ।

उदाहरण के साथ function

// define a function
function add(x, y) { return x + y; }

// use it
console.log(add(1, 2)); // 3

// oops, someone mutated your function
add = function (x, y) { return x - y; };

// now this is not what you expected
console.log(add(1, 2)); // -1

उसी उदाहरण के साथ const

// define a function (wow! that is 8 chars shorter)
const add = (x, y) => x + y;

// use it
console.log(add(1, 2)); // 3

// someone tries to mutate the function
add = (x, y) => x - y; // Uncaught TypeError: Assignment to constant variable.
// the intruder fails and your function remains unchanged


1
और आप दो बार फंक्शन ऐड (x, y) घोषित कर सकते हैं, लेकिन आप दो बार
कॉन्स्टेंट

33
1. अपरिहार्यता एक वास्तविक लाभ है, लेकिन किसी के लिए वास्तव में एक फ़ंक्शन को अधिलेखित करना बहुत दुर्लभ है। 2. फैट एरो सिंटैक्स तब तक छोटा नहीं होता जब तक कि आपका फ़ंक्शन एक अभिव्यक्ति नहीं हो सकता। function f(x, y) {18 वर्ण है, const f = (x, y) => {21 वर्ण है, इसलिए 3 वर्ण अधिक लंबा है। 3. इस बंधन को बनाए रखना केवल तभी मायने रखता है जब कार्यों को एक विधि के अंदर परिभाषित किया जाए (या अन्य फ़ंक्शन जिसमें यह सार्थक है)। शीर्ष स्तर की स्क्रिप्ट में यह व्यर्थ है। मैं यह नहीं कह रहा हूं कि आप गलत हैं, सिर्फ इसलिए कि आप जिन कारणों का उल्लेख करते हैं वे बहुत प्रासंगिक नहीं हैं।
22

@ नॉटिबल तो कुछ अन्य वैध कारण क्या हैं?
अनीश रामास्वामी

13
पुराने जमाने के फंक्शन सिंटेक्स का एक फायदा यह है कि डिबगिंग के दौरान इसका एक नाम होता है।
उपयोगकर्ता 949300

3
मैं फंक्शन डिक्लेरेशन को री-बाइंड करने से रोकने के लिए लिंटर का इस्तेमाल करूंगा।
फ्रैंकलिन यू

32

यह सवाल पूछे जाने में तीन साल हो गए हैं, लेकिन मैं अभी इसके पार आ रहा हूं। चूंकि यह उत्तर ढेर के नीचे है, कृपया मुझे इसे दोहराने की अनुमति दें:

प्रश्न: मैं दिलचस्पी रखता हूँ कि जावास्क्रिप्ट में किसी विशेष कार्य में किस प्रकार के मान निर्धारित किए जा सकते हैं। क्या यह मान्य है? दी यह काम करता है, लेकिन क्या यह किसी भी कारण से बुरा माना जाता है?

मुझे एक स्पष्ट जावास्क्रिप्ट कोडर के निरीक्षण के बाद कुछ शोध करने के लिए प्रेरित किया गया था, जो हमेशा स्पष्ट कारण / लाभ नहीं होने पर भी constकथन का उपयोग करता functionsहै।

" क्या यह किसी भी कारण से बुरा व्यवहार माना जाता है? " के जवाब में, मुझे कहना चाहिए, IMO, हाँ यह है, या कम से कम, कथन का उपयोग करने के फायदे हैं function

यह मुझे लगता है कि यह काफी हद तक प्राथमिकता और शैली का विषय है। ऊपर कुछ अच्छे तर्क प्रस्तुत किए गए हैं, लेकिन इस लेख में ऐसा कुछ भी स्पष्ट नहीं किया गया है:

लगातार भ्रम: मैं अभी भी जावास्क्रिप्ट फ़ंक्शन कथनों का उपयोग medium.freecodecamp.org/Bill Sourour, जावास्क्रिप्ट गुरु, सलाहकार और शिक्षक द्वारा करता हूं।

मैं सभी से उस लेख को पढ़ने का आग्रह करता हूं, भले ही आपने पहले ही निर्णय कर लिया हो।

यहाँ मुख्य बिंदु हैं:

समारोह कथनों में दो स्पष्ट फायदे हैं [कांस्ट] फंक्शन एक्सप्रेशन:

लाभ # 1: इरादे की स्पष्टता

जब कोड की हजारों लाइनों को एक दिन में स्कैन किया जाता है, तो यह प्रोग्रामर के इरादे को जितनी जल्दी हो सके और आसानी से पता लगाने में सक्षम हो सकता है।

लाभ # 2: घोषणा का आदेश == निष्पादन का आदेश

आदर्श रूप में, मैं अपने कोड को कम से कम उस क्रम में घोषित करना चाहता हूं जिससे मुझे उम्मीद है कि इसे निष्पादित किया जाएगा।

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

जो मैंने ऊपर वर्णित किया है वह हमें कोड लिखने के लिए मजबूर करता है जो उल्टा दिखता है। हमें सबसे निचले स्तर के समारोह से शुरुआत करनी होगी और अपने तरीके से काम करना होगा।

मेरा दिमाग इस तरह से काम नहीं करता है। मैं विवरण से पहले संदर्भ चाहता हूं।

अधिकांश कोड मनुष्यों द्वारा लिखे गए हैं। तो यह समझ में आता है कि ज्यादातर लोगों के आदेश को समझने में मोटे तौर पर कोड के निष्पादन के आदेश का पालन होता है।


1
क्या आप इरादे की स्पष्टता पर थोड़ा और टिप्पणी कर सकते हैं? मुझे # 2 मिलता है, लेकिन जहाँ तक मैं बता सकता हूँ # 1 सिर्फ एक (पूर्व?) # 2 का पुनर्मिलन है। मैं एक मामले के बारे में सोच सकता हूं, अर्थात defaultErrorHandlerएक अनाम फ़ंक्शन के रूप में असाइन किए गए अपने स्वयं के कांस्टेबल्स जिन्हें मैं तब हैंडलर से कॉल कर सकता हूं। यह मुझे वैकल्पिक रूप से इस डिफ़ॉल्ट त्रुटि हैंडलर को 'ओवरराइड' करने में सक्षम करेगा क्योंकि मुझे इसकी आवश्यकता है। कुछ को केवल एक त्रुटि ऑब्जेक्ट वापस करने की आवश्यकता होती है और दूसरों को एक HTTP प्रतिक्रिया वापस करने की आवश्यकता होती है, क्रिया के स्तर को बदलते हुए। फिर भी कोड संरचना की परवाह किए बिना एक परिचित पैटर्न हो सकता है।
जेक टी।

हो सकता है कि मेरा विचार बहुत जटिल हो, हालांकि! बस कुछ नई प्रथाओं के आसपास मेरे सिर लपेटने, अभी तक उन्हें लागू करने में एक टन खर्च नहीं किया है। बस मैं वास्तव में .then( res.success, res.error )उन गुमनाम कार्यों से बहुत अधिक पसंद करता हूं जिन्हें मैं केवल कॉल करने के लिए घोषित कर रहा था res.success(value);। एक .then( ..., defaultErrorHandler)सामान्य पैटर्न अच्छा हो सकता है, एक शीर्ष स्तर के साथ डिफ़ॉल्ट डिफॉल्टहैंडलर फ़ंक्शन होता है, और वैकल्पिक const defaultErrorHandler = error => { ... }रूप से वांछित रूप से फ़ंक्शन स्कोप के भीतर घोषित किया जाता है।
जेक टी।

1
@JakeT। आरई "क्या आप आशय की स्पष्टता पर थोड़ा और टिप्पणी कर सकते हैं?"। ठीक है, सबसे पहले, उस बयान को मेरा नहीं बनाया गया था, लेकिन freecodecamp.org/Bill Sourour, उस लेख के लेखक द्वारा। लेकिन यह मेरे लिए वास्तविक सामान्य ज्ञान है। अगर मैं "फ़ंक्शन कल ()" पढ़ता हूं, तो मैं तुरंत जानता हूं कि यह एक फ़ंक्शन है। लेकिन अगर मैं कल "कॉन्स्टेंस = () =>" पढ़ता हूं, तो मेरे पास एक पल के लिए रुक जाता है और मेरे सिर में वाक्य रचना को अंतिम रूप से निर्धारित करने के लिए, ठीक है, हाँ, यह एक फ़ंक्शन है।
JMichaelTX

1
एक और बात, अगर मेरे पास किसी और द्वारा लिखी गई लंबी स्क्रिप्ट है, और मैं सभी कार्यों को देखना चाहता हूं, तो मैं उन्हें खोजने के लिए "फ़ंक्शन" पर त्वरित खोज कर सकता हूं। या इससे भी बेहतर, मैं सभी कार्यों को निकालने के लिए एक त्वरित JS RegEx लिख सकता हूं। IMO, "कॉन्स्ट" स्टेटमेंट केवल डेटा के लिए है (फ़ंक्शन नहीं) जो परिवर्तित नहीं होगा।
JMichaelTX

10

के उपयोग के लिए कुछ बहुत ही महत्वपूर्ण लाभ हैं constऔर कुछ लोग कहेंगे कि इसका उपयोग जहां भी संभव हो, इसे जानबूझकर और संकेत के कारण किया जाना चाहिए।

यह है, जहाँ तक मैं बता सकता हूँ, जावास्क्रिप्ट में चर का सबसे अधिक सूचक और अनुमानित घोषणा है, और सबसे उपयोगी में से एक, यह कैसे विवश है। क्यों? क्योंकि यह उपलब्ध varऔर letघोषणाओं के लिए कुछ संभावनाओं को समाप्त करता है ।

जब आप पढ़ते हैं तो आप क्या अनुमान लगा सकते हैं const? आप केवल निम्नलिखित constकथन को पढ़कर और उस चर के अन्य संदर्भों के लिए स्कैन किए बिना निम्नलिखित सभी को जानते हैं :

  • मान उस चर के लिए बाध्य है (हालांकि इसकी अंतर्निहित वस्तु गहरी अपरिवर्तनीय नहीं है)
  • इसे तुरंत इसके ब्लॉक से बाहर नहीं पहुँचा जा सकता है
  • अस्थायी रूप से मृत क्षेत्र (TDZ) नियमों के कारण, बाध्यकारी को घोषणा से पहले कभी एक्सेस नहीं किया जाता है।

निम्नलिखित उद्धरण से है एक लेख के लाभों में बहस letऔर const। यह कीवर्ड के अवरोधों / सीमाओं के बारे में आपके प्रश्न का सीधे उत्तर देता है:

इस तरह की बाधाओं के द्वारा की पेशकश की letऔर constसमझने में आसान कोड बनाने का एक शक्तिशाली तरीका है। आपके द्वारा लिखे गए कोड में इनमें से कई बाधाओं को प्राप्त करने का प्रयास करें। अधिक घोषणात्मक सीमाएं जो उस कोड को सीमित करती हैं, जो कोड का एक मतलब हो सकता है, भविष्य में मनुष्यों को पढ़ने, पार्स करने और समझने के लिए आसान और तेज़ है।

दी, constघोषणा की तुलना में एक घोषणा के लिए अधिक नियम हैं var: ब्लॉक-स्कोप्ड, टीडीजेड, घोषणा पर असाइन करें, कोई पुनर्मूल्यांकन नहीं। जबकि varबयान केवल सिग्नल फंक्शन स्कूपिंग हैं। नियम-गिनती, हालांकि, बहुत अधिक जानकारी नहीं देती है। जटिलता के संदर्भ में इन नियमों को तौलना बेहतर है: क्या नियम जटिलता को जोड़ता या घटाता है? के मामले में const, ब्लॉक स्कूपिंग का मतलब फ़ंक्शन स्कूपिंग की तुलना में एक संकीर्ण गुंजाइश है, टीडीजेड का मतलब है कि हमें घोषणा से पहले उपयोग को स्पॉट करने के लिए स्कोप को पीछे की ओर से स्कैन करने की आवश्यकता नहीं है, और असाइनमेंट नियमों का मतलब है कि बाध्यकारी हमेशा संरक्षित रहेगा। एक ही संदर्भ।

और अधिक विवश कथन, सरल कोड का एक टुकड़ा बन जाता है। जैसा कि हम एक बयान का मतलब है कि बाधाओं को जोड़ सकते हैं, कोड कम अप्रत्याशित हो जाता है। यह सबसे बड़ी वजहों में से एक है कि सांख्यिकीय रूप से टाइप किए गए कार्यक्रम आमतौर पर गतिशील रूप से टाइप किए गए लोगों की तुलना में पढ़ने में आसान होते हैं। स्टेटिक टाइपिंग प्रोग्राम राइटर पर एक बड़ी बाधा डालती है, लेकिन यह प्रोग्राम की व्याख्या कैसे की जा सकती है, इसके कोड को समझने में आसान बनाने पर एक बड़ी बाधा डालती है।

इन तर्कों को ध्यान में रखते हुए, यह अनुशंसा की जाती है कि आप constजहां संभव हो उपयोग करें , क्योंकि यह वह कथन है जो हमें सोचने के लिए कम से कम संभावनाएं देता है।

स्रोत: https://ponyfoo.com/articles/var-let-const

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.