कॉफीस्क्रिप्ट और नामित कार्य


10

कहीं और , कॉफीस्क्रिप्ट में एक नामित फ़ंक्शन की शब्दावली पर एक तर्क उत्पन्न हुआ है। विशेष रूप से किसी को इस तरह से संदर्भित:

 foo = ->
    console.log("bar")

एक नामित कार्य के रूप में। लेकिन इस पर आपत्ति जताई गई कि CoffeeScript में सब कुछ अनाम फ़ंक्शन हैं और कोई भी फ़ंक्शन नाम नहीं हैं। यह निश्चित रूप से सच है, कॉफीस्क्रिप्ट में केवल फ़ंक्शन अभिव्यक्तियाँ हैं जो तब एक चर में संग्रहीत की जा सकती हैं। लेकिन मुझे नहीं लगता कि इसका मतलब यह है कि इसे एक नामांकित फ़ंक्शन कहा जाए।

जैसा कि मैं इसे देखता हूं, यह एक नामित फ़ंक्शन है क्योंकि इसका एक फ़ंक्शन जिसे एक नाम दिया गया है। यह सच है, इसका एक नामित फ़ंक्शन नहीं है उसी तरह कि कुछ अन्य भाषाओं ने फ़ंक्शंस का नाम दिया है, लेकिन मुझे लगता है कि इसके करीब पर्याप्त है कि इसे नामांकित फ़ंक्शन कहना अनुचित नहीं है। अन्यथा जोर देने के लिए सिर्फ नाइटपैकिंग लगता है।

क्या मैं यह सोचकर दोपहर का भोजन करने के लिए बाहर गया कि यह एक नामित कार्य नहीं है सिर्फ नाइटपार्टिंग है?


3
यह पूरा सवाल ही नहीं है, ठीक है, nitpicking? :-)
Mat

@ मट, हाँ, ऐसा लगता है कि मैं नाइटपैकिंग के बारे में बात करने से बच नहीं सकता
विंस्टन इर्वर्ट

प्रोग्रामर के छोटे पूल के लिए जिनसे मैं (प्रोग्रामर के बाहर) बात करता हूं। वह है, वे ज्यादातर जावास्क्रिप्ट के नामित कार्यों को "कक्षाएं" (निर्माणकर्ता) के रूप में उपयोग करने के लिए कहते हैं, जबकि गुमनाम फ़ंक्शन सादे पुराने कार्यों के लिए चर में संग्रहीत होते हैं।
साल

1
"जस्ट नाइटपैकिंग" से तात्पर्य है कि उत्तर से कोई फर्क नहीं पड़ता, और यह कि किसी भाषा की सूक्ष्मता को समझना एक योग्य लक्ष्य नहीं है।
user229044

मैं इसे कॉफ़ीस्क्रिप्ट के अनुरूप देख सकता हूं: foo = ->एक साधारण पुराना कार्य है, जबकि class Fooएक रचनाकार है। मुझे कोई कारण नहीं दिखता कि foo = ->कड़ाई से गुमनाम क्यों कहा जाए।
साल

जवाबों:


20

कॉफीस्क्रिप्ट को स्पष्ट रूप से जावास्क्रिप्ट से जोड़ा जाता है, और जावास्क्रिप्ट निम्नलिखित अभिव्यक्तियों के बीच अंतर करता है:

function foo() { ... }
var foo = function () { ... }

वास्तव में, आप भी लिख सकते हैं:

var foo = function bar () { ... }

चूंकि यह अंतर जावास्क्रिप्ट में मायने रखता है, इसलिए कॉफ़ीस्क्रिप्ट के बारे में बात करते समय उन्हीं शब्दों का उपयोग करना समझ में आता है। हालाँकि, CoffeeScript function foo ()सिंटैक्स की तरह किसी भी चीज़ का समर्थन नहीं करता है , इसलिए हम कह सकते हैं कि इसमें "नामित" फ़ंक्शन नहीं हैं।

एक अर्थ में, नाम उस फंक्शन डेफिनिशन का हिस्सा है function foo() { ... }, जहां दूसरे मामले में आप सिर्फ एक फंक्शन बनाते हैं और उसे वेरिएबल में असाइन करते हैं। यह परिलक्षित होता है, उदाहरण के लिए, (गैर-मानक) nameकार्यों की संपत्ति में: पहले मामले में, foo.nameआपको देगा "foo"और दूसरे में यह आपको देगा ""

इसके अतिरिक्त, जावास्क्रिप्ट में, ये इस बात से भी भिन्न होते हैं कि कैसे उन्हें दायरे में लाया जाता है: पहला संस्करण "फहराया" जाता है और इसके दायरे में उपलब्ध होता है जहां दूसरी परिभाषा उपलब्ध होने के बाद ही उपलब्ध होती है।

मूल रूप से, इसे केवल जावास्क्रिप्ट-विशिष्ट शब्दजाल के रूप में सोचें, जो कॉफीस्क्रिप्ट में स्थानांतरित हो जाता है क्योंकि कॉफीस्क्रिप्ट जेएस से बहुत निकट से संबंधित है।


1
यह सच है कि ऐसी कोई बात नहीं है function foo () {}। हालाँकि, आप अभी भी classनिर्माण के माध्यम से नामांकित फ़ंक्शन को प्रारंभ कर सकते हैं । बस इतना है कि संकलित कॉफीस्क्रिप्ट (परिणामस्वरूप जावास्क्रिप्ट) बहुत अधिक क्रियात्मक है कि अधिकांश एक नामित फ़ंक्शन कैसे लिखेंगे।
साल

1
और यह भी, एक तकनीकी चेतावनी है: आपके fooफ़ंक्शन का शरीर फहराया नहीं जाएगा।
साल

1
jelivs: कोई समस्या नहीं। आपके उत्तर पर लिखी गई अंतिम टिप्पणी में से एक सुधार: आपका class fooफ़ंक्शन बॉडी फ़ाइल के शीर्ष पर नहीं फहराया जाएगा।
साल

चूंकि कॉफीस्क्रिप्ट नाम और अनाम कार्यों के बीच अंतर नहीं करता है, क्या हम वास्तव में कह सकते हैं कि शब्दावली को कॉफीस्क्रिप्ट में स्थानांतरित कर दिया गया है? जावास्क्रिप्ट का भेद बस उस भाषा में कुछ भी मतलब नहीं है।
विंस्टन इवर्ट

@InstonEwert: यह इसलिए मायने रखता है क्योंकि CoffeeScript जावास्क्रिप्ट के बहुत करीब है। आखिरकार, "सुनहरा नियम" है: "यह सिर्फ जावास्क्रिप्ट है"
तिखन जेल्विस

5

यह ध्यान देने योग्य है कि उपयोगकर्ता ने स्पष्ट रूप से कहा था कि वे एक "अनाम फ़ंक्शन को नामांकित फ़ंक्शन" में बदल रहे थे, दोनों शर्तों के जावास्क्रिप्ट दुनिया में एक मजबूत, मौजूदा अर्थ और विशेष रूप से अलग-अलग कार्यात्मकताएं हैं। मौजूदा अर्थ को देखते हुए, ऐसी कोई बात नहीं कर रहे थे, और मैंने इसे इंगित किया।

कॉफीस्क्रिप्ट को जावास्क्रिप्ट से इतनी दूर नहीं किया गया है कि आपको उन शर्तों को फिर से परिभाषित करना चाहिए, जो दोनों एक भाषा में कुछ और करने के लिए साझा करते हैं। कॉफीस्क्रिप्ट कुछ बुलबुले में मौजूद नहीं है, इसके जावास्क्रिप्ट कार्यान्वयन से जिस तरह से आप तर्क दे सकते हैं कि सी ++ विधानसभा से अलग है। अनाम फ़ंक्शन और नामांकित फ़ंक्शन के बीच का अंतर जानना मायने रखता है , क्योंकि यदि आप अपने "नाम" CoffeeScript फ़ंक्शन की अपेक्षा करते हैं , तो वास्तविक नाम फ़ंक्शन की तरह व्यवहार करने के लिए , आप निराश होने वाले हैं:

doStuff() # I cause an error

# ... later

doStuff = (x,y) ->
  alert("Were I actually a named function, this would work!")

समतुल्य जावास्क्रिप्ट ठीक काम करेगा, एक वास्तविक नाम समारोह के साथ:

doStuff(); // I work just fine!

// later....

function doStuff() {
  alert("I'm a real named function!")
}

आप सही हो सकते हैं कि मैं सिर्फ "नाइटपैकिंग" हूं, लेकिन ऐसा क्या है? कंप्यूटर में सूक्ष्म अंक प्रोग्रामिंग बात है, और जा रहा है "तकनीकी रूप से" सही महत्वपूर्ण है। यह कोड लिखने के बीच का अंतर है जो काम करता है, और वास्तव में यह समझना कि आपका कोड सही क्यों है ।


1
उदाहरण के लिए, यदि मैंने पायथन में आपके उदाहरण की कोशिश की, तो भी यह काम नहीं करेगा। इसलिए मुझे यकीन नहीं है कि अनाम कार्यों के साथ कुछ भी करना है।
विंस्टन इवर्ट

1
@WinstonEwert मेरा अपडेट देखें पायथन वास्तव में इसके साथ करने के लिए कुछ भी नहीं है ...
user229044

@ मेरी, मेरी बात यह है कि नामित कार्य आवश्यक रूप से उस तरह से कार्य नहीं करते हैं, हालांकि वे जावास्क्रिप्ट में करते हैं। इसलिए, खुद को फहराने से कॉफीस्क्रिप्ट के कार्यों को अयोग्य घोषित नहीं किया जाता है।
विंस्टन एवर्ट

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

3

क्या मैं यह सोचकर दोपहर का भोजन करने के लिए बाहर गया कि यह एक नामित कार्य नहीं है सिर्फ नाइटपार्टिंग है?

नहीं। आखिरकार, शब्दार्थ के संदर्भ में, आपका फ़ंक्शन संदर्भ एक चर में संग्रहीत किया जाता है, जिसे आप एक चर नाम से संदर्भित कर सकते हैं ।


3

निश्चित रूप से एक नाइटपिक नहीं, इमो। मैं पठनीयता के लिए इसका बड़े पैमाने पर उपयोग करता हूं:

readfile()
dothis()
dothat()
thistoo()
writefile()

function readfile() {
    ...
}
...

इस प्रकार:

"कॉफ़ीस्क्रिप्ट" में वास्तविक नामित फ़ंक्शन

hello()

`function hello() {`
console.log 'hello'
dothings()
`}`

आप backtick के माध्यम से शुद्ध JS से बच जाते हैं

ध्यान दें कि आप अपने फ़ंक्शन बॉडी पर इंडेंट नहीं कर सकते।

चियर्स


1

बच्चों के साथ बहस करने में समय बर्बाद न करें। यह कभी फलदायी नहीं होता। हां, हर कोई जानता है कि कॉफीस्क्रिप्ट में "नामित फ़ंक्शन" से आपका क्या मतलब है, भले ही यह तकनीकी रूप से गलत हो। नहीं, तकनीकी रूप से गलत लेकिन व्यापक रूप से समझने वाली शब्दावली का उपयोग करने से प्रस्तावित समाधान की शुद्धता या गलतता पर कोई असर नहीं पड़ता है। क्या यह संभव है कि कुछ अशुद्धि प्राप्त करने के बिना अधिक सटीक हो? शायद ऩही। हालांकि, इसका मतलब यह नहीं है कि लोग इसे स्लाइड करने देंगे। बस इस आदमी की कल्पना करो की बातचीत के दूसरे छोर पर ।

तकनीकी रूप से गलत होने का कारण यह है कि आपने फ़ंक्शन का नाम नहीं दिया है, आपने फ़ंक्शन का संदर्भ लिया है। विचार करें:

foo = bar = ->
  console.log "What's my name?"

फ़ंक्शन का नाम क्या है? fooऔर barदोनों एक ही फ़ंक्शन को संदर्भित कर रहे हैं, लेकिन अलग-अलग नाम हैं। किसी भी फ़ंक्शन को संदर्भित करने के लिए fooया तो, या barकिसी भी समय किसी भी समय पुन: असाइन किया जा सकता है, या यहां तक ​​कि पूरी तरह से फ़ंक्शन को बदले बिना।


0

तो, जिस तरह से मैंने इसे पढ़ा है वह इस प्रकार है:

जब आप एक जावास्क्रिप्ट कंसोल में फ़ंक्शन का उपयोग करके घोषणा करते हैं

var foo = function() { ... }

और फिर fooकोष्ठक के बिना आह्वान , यह रिटर्न

function() { ... }

हालाँकि, यदि आप इसका उपयोग करके परिभाषित करते हैं

function foo() { ... }

और फिर fooकोष्ठक के बिना फिर से आह्वान , यह लौटता है

function foo() { ... }

पहले मामले में, मैं कहूंगा कि आप "फू" नामक एक चर घोषित कर रहे हैं, जिसमें एक अनाम फ़ंक्शन संग्रहीत किया गया है। दूसरे मामले में, मैं कहूंगा कि आप वास्तव में "फू" नाम के एक फ़ंक्शन की घोषणा कर रहे हैं।

क्योंकि कॉफीस्क्रिप्ट पहले पैटर्न का उपयोग करता है, मैं सहमत हूं कि यह तकनीकी रूप से सही है कि कॉफीस्क्रिप्ट के कार्य सभी अनाम फ़ंक्शन नामांकित चर में संग्रहीत किए जा रहे हैं।

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