कोई भी जावास्क्रिप्ट कोड "बाइंडिंग में कटौती" क्यों करना चाहता है?


10

ए का उपयोग करने का कारण

(0, foo.fn)();

करने के लिए है बाध्यकारी कटौती : thisकरने के लिए बाध्य नहीं रह नहीं की जाएगी fooलेकिन वैश्विक वस्तु के लिए बाध्य होंगे।

लेकिन क्या कारण है कि कोई भी जावास्क्रिप्ट कोड (या Google का JS कोड) बाइंडिंग में कटौती करना चाहेगा? (और यह एक विरोधी पैटर्न है या नहीं?)


इसे बाध्यकारी कहना सही नहीं लगता। bindविधि बांधता है। यहाँ यह केवल एक संदर्भ परिवर्तन है। आप बंधन (द्वारा बनाए गए बंधन bind) को काट या खो नहीं सकते ।
— मार्जेलिन

हो सकता है कि यह कोड किसी कार्यात्मक भाषा (क्लोजरस्क्रिप्ट) से ट्रांसपाइलर द्वारा बनाया गया हो?
— मारजेलिन

बबल का संभावित डुप्लिकेट आयातित फ़ंक्शन को (0, fn) (…) पर फिर से क्यों लिखता है? - या आप इसे कहां देख रहे हैं?
— बरगी

मुझे लगता है कि मैंने इसे Google के कोड में देखा है और संभवतः
— एंगुलर

जवाबों:


8

इस तरह के कोड को आमतौर पर ट्रांसपॉइलर (जैसे बाबेल) द्वारा उत्पन्न किया जाता है, ताकि आधुनिक जावास्क्रिप्ट को परिवर्तित किया जा सके - जो विनिर्देश के सबसे हालिया परिवर्धन का उपयोग करता है - एक जावास्क्रिप्ट संस्करण के लिए जो अधिक व्यापक रूप से समर्थित है।

यहाँ एक उदाहरण है जहां यह वाष्पीकरण पैटर्न होता है:

मान लें कि ट्रांसप्लिकेशन से पहले हमारे पास यह मूल कोड है:

import {myfunc} from "mymodule";
myfunc();

यह ES5- संगत कोड बनाने के लिए, आप ऐसा कर सकते हैं:

"use strict";    
var mymodule = require("mymodule");    
mymodule.myfunc();

लेकिन यहां हम मान के myfuncसाथ निष्पादित mymoduleकरेंगे this, जो मूल कोड में नहीं हो रहा है। और हालांकि कि हो सकता है नहीं हमेशा एक मुद्दा हो, यह समारोह बर्ताव करता है सुनिश्चित करने के लिए बेहतर है बस इसे मूल संस्करण में करते हैं भले ही उस समारोह एक का प्रयोग करेंगे, thisकैसे असामान्य या यहाँ तक कि बेकार के उपयोग कि - संदर्भ thisमें myfunc(हो सकता है क्योंकि मूल संस्करण में भी यह होगा undefined)।

उदाहरण के लिए, यदि मूल कोड this.memberFun()फ़ंक्शन में एक संदर्भ के कारण एक त्रुटि को फेंक देगा, तो यह ट्रांसपेंस्ड संस्करण में भी फेंक देगा।

तो यह है कि अल्पविराम ऑपरेटर उस अंतर से छुटकारा पाने के लिए उपयोग किया जाता है:

(0, mymodule.myfunc)();

दी, कोड में है कि आप अपने आप को लिखते हैं, आप एक अच्छा उपयोग के मामले इस पैटर्न के लिए कभी नहीं होगा, जैसा कि आप प्रयोग नहीं करेंगे thisमें myfuncपहली जगह में।


कैसे requireया तो ES6 या ES5 से संबंधित है? मुझे लगता था कि आवश्यकता एक नोड मॉड्यूल है।
— शंकुवृक्ष

requireवास्तव में नोड में उपलब्ध एक फ़ंक्शन है या फिर लाइब्रेरिज़, आवश्यकता.ज, ... आदि जैसे पुस्तकालयों में प्रदान किया जाता है। यह विशेष रूप से ES5 / 6 से संबंधित नहीं है। दूसरी ओर, एक ES6 + भाषा निर्माण importजैसे ट्रांसप्लिसीशन जैसी चीज़ के बिना ES5 को वापस नहीं भेजा जा सकता है।
— 12-26 बजे त्रिनकोट

इसलिए यदि इसे सारांश की कई पंक्तियों में संघनित किया जाए: यदि यह एक पुस्तकालय या मॉड्यूल है जिसमें बहुत सारे कार्य शामिल हैं जो वास्तव में विधियाँ या OO (के रूप में modA.fn1) नहीं हैं, तो इन कार्यों को वास्तव में उपयोग नहीं करना चाहिए thisलेकिन यदि दुर्घटना से वे करते हैं, हम नहीं चाहते कि thisसाइड इफेक्ट के रूप में किसी भी तरह से मॉड्यूल को प्रभावित किया जाए, इसलिए हम बाध्यकारी को काटते हैं, यह व्यवहार करते हैं कि यह कैसे व्यवहार करना चाहिए अगर यह एक स्वतंत्र कार्य है
— nonopolarity

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