मैं react
कोड का एक समूह पढ रहा हूं और मैं इस तरह सामान है कि मुझे समझ नहीं आता देखें: इस तरह यहजावास्क्रिप्ट में एकाधिक तीर फ़ंक्शंस का क्या अर्थ है?
handleChange = field => e => {
e.preventDefault();
/// Do something here
}
मैं react
कोड का एक समूह पढ रहा हूं और मैं इस तरह सामान है कि मुझे समझ नहीं आता देखें: इस तरह यहजावास्क्रिप्ट में एकाधिक तीर फ़ंक्शंस का क्या अर्थ है?
handleChange = field => e => {
e.preventDefault();
/// Do something here
}
Think, हर बार जब आप एक तीर दिखाई दे, तो आप इसे function
के साथ बदलें। function parameters
तीर से पहले परिभाषित किया गया है।
तो अपने उदाहरण में:
field => // function(field){}
e => { e.preventDefault(); } // function(e){e.preventDefault();}
और फिर एक साथ:
function (field) { return function (e) { e.preventDefault(); }; }
// Basic syntax:
(param1, param2, paramN) => { statements }
(param1, param2, paramN) => expression
// equivalent to: => { return expression; }
// Parentheses are optional when there's only one argument:
singleParam => { statements }
singleParam => expression
व्याख्यात्मक रूप से बाध्य 'उल्लेख' का उल्लेख करना न भूलें। – naomik
available syntaxes of arrow functions समझना कि तुम क्या व्यवहार वे जब शुरू कर रहे हैं की समझ दे देंगे आपके द्वारा प्रदान किए गए उदाहरणों की तरह 'जंजीर'।
जब एक तीर समारोह के साथ या एक से अधिक पैरामीटर के बिना ब्लॉक ब्रेसिज़ बिना लिखा है,, अभिव्यक्ति है कि गठन समारोह के शरीर परोक्ष वापस लौटा है। आपके उदाहरण में, अभिव्यक्ति एक और तीर कार्य है।
No arrow funcs Implicitly return `e=>{…}` Explicitly return `e=>{…}`
---------------------------------------------------------------------------------
function (field) { | field => e => { | field => {
return function (e) { | | return e => {
e.preventDefault() | e.preventDefault() | e.preventDefault()
} | | }
} | } | }
तीर सिंटैक्स का उपयोग अनाम प्रक्रियाएं लेखन का एक और लाभ यह है कि वे गुंजाइश जिसमें वे परिभाषित कर रहे हैं करने के लिए बाध्य कर रहे हैं lexically है। 'Arrow functions' on MDN से:
एक तीर समारोह अभिव्यक्तिfunction expressions की तुलना में एक छोटा वाक्यविन्यास है और lexically this मूल्य बांधता है। तीर कार्य हमेशा anonymous होते हैं।
इस पर विचार है कि यह एक reactjs आवेदन से लिया जाता है अपने उदाहरण में विशेष रूप से प्रासंगिक है। जैसा कि @ नोमिक द्वारा इंगित किया गया है, वास्तव में आप अक्सर this
का उपयोग करके एक्सेस करते हैं।उदाहरण के लिए:
Unbound Explicitly bound Implicitly bound
------------------------------------------------------------------------------
function (field) { | function (field) { | field => e => {
return function (e) { | return function (e) { |
this.setState(...) | this.setState(...) | this.setState(...)
} | }.bind(this) |
} | }.bind(this) | }
कोई "पतला तीर फ़ंक्शन" नहीं है। आधिकारिक शब्दावली के साथ क्यों नहीं रहें और इसे "तीर फ़ंक्शन" कहें? –
आपको तीर फ़ंक्शन के व्याख्यात्मक 'यह' – naomik
@naomik के बारे में कुछ उल्लेख करना चाहिए, मैं सहमत हूं कि यह उपयोगी जानकारी है हालांकि मेरे उत्तर में मैं बिना किसी जानकारी के इसे कम से कम बिना किसी समस्या के हल करने के प्रयास कर रहा हूं। मेरे उत्तर में से कोई भी उदाहरण सही ढंग से निष्पादित करने के लिए उनके निष्पादन संदर्भ पर भरोसा नहीं करता है। – sdgluck
पहले, इस दो पैरामीटर है & hellip के साथ समारोह की जांच है कि;
let add = (x,y) => x + y;
add(2,3); //=> 5
यहां यह फिर से करीबी रूप और नरक में है;
let add = x => y => x + y;
यहाँ एक ही कोड तीर कार्यों है & hellip के बिना है;
let add = function (x) {
return function (y) {
return x + y;
};
};
फोकस पर return
यह मदद कर सकता है यह एक और तरीका है कल्पना करने के लिए। हम जानते हैं कि तीर कार्य इस तरह काम करते हैं - चलिए वापसी मूल्य पर विशेष ध्यान दें।
let f = someParam =>returnValue
इसलिए हमारे add
फ़ंक्शन एक समारोह - हम जोड़ा स्पष्टता के लिए कोष्ठक का उपयोग कर सकते हैं। बोल्ड पाठ हमारे समारोह add
let add = x =>(y => x + y)
के रिटर्न मान दूसरे शब्दों कुछ नंबर एक समारोह
let x = 2;
add (2) // returns (y => 2 + y)
रिटर्न x
की add
curried कार्यों कॉलिंग
में है तो हमारे सी का उपयोग करने के लिए चिंतित कार्य, हमें इसे थोड़ा अलग और नरक कहते हैं;
add(2)(3); // returns 5
ऐसा इसलिए है क्योंकि पहला (बाहरी) फ़ंक्शन कॉल दूसरा (आंतरिक) फ़ंक्शन देता है। दूसरे फ़ंक्शन को कॉल करने के बाद ही हम वास्तव में परिणाम प्राप्त करते हैं।अगर हम कॉल को दो लाइनों और नरक पर अलग करते हैं तो यह अधिक स्पष्ट है;
let add2 = add(2); // returns function(y) { return 2 + y }
add2(3); // returns 5
अपने कोड
संबंधित के लिए हमारी नई समझ आवेदन: ”What’s the difference between binding, partial application, and currying?”
ठीक है, अब हम समझते हैं कि यह कैसे काम करता है, के लिए अपने कोड
को देखोhandleChange = field => e => {
e.preventDefault();
/// Do something here
}
हम तीर कार्यों और नरक का उपयोग किए बिना इसका प्रतिनिधित्व करके शुरू करेंगे;
handleChange = function(field) {
return function(e) {
e.preventDefault();
// Do something here
// return ...
};
};
हालांकि, क्योंकि तीर कार्यों lexically this
बाध्य है, यह होगा वास्तव में देखो यह है & hellip की तरह अधिक;
handleChange = function(field) {
return function(e) {
e.preventDefault();
// Do something here
// return ...
}.bind(this);
}.bind(this);
शायद अब हम देख सकते हैं कि यह और अधिक स्पष्ट रूप से क्या कर रहा है। handleChange
फ़ंक्शन एक निर्दिष्ट field
के लिए एक फ़ंक्शन बना रहा है। यह एक आसान प्रतिक्रिया तकनीक है क्योंकि आपको अपने अनुप्रयोगों को अपडेट करने के लिए प्रत्येक इनपुट पर अपने स्वयं के श्रोताओं को सेट करने की आवश्यकता है। handleChange
फ़ंक्शन का उपयोग करके, हम सभी डुप्लिकेट कोड को समाप्त कर सकते हैं जिसके परिणामस्वरूप प्रत्येक क्षेत्र के लिए change
श्रोताओं की स्थापना होगी।
कूल!
यहाँ मैं lexically बाँध this
क्योंकि मूल add
समारोह किसी भी संदर्भ का उपयोग नहीं करता नहीं था, इसलिए यह महत्वपूर्ण इस मामले में इसे संरक्षित करने के नहीं है।
एक तीर फ़ंक्शन अभिव्यक्ति में फ़ंक्शन अभिव्यक्ति की तुलना में एक छोटा वाक्यविन्यास होता है और इसका अपना, तर्क, सुपर या नया लक्ष्य नहीं होता है। ये फ़ंक्शन एक्सप्रेशन गैर-विधि फ़ंक्शंस के लिए सबसे उपयुक्त हैं, और इन्हें कन्स्ट्रक्टर के रूप में उपयोग नहीं किया जा सकता है। Arrow function
एक सामान्य युक्ति, यदि आप किसी भी नए जेएस सिंटैक्स द्वारा भ्रमित हो जाते हैं और यह कैसे संकलित होगा, तो आप babel देख सकते हैं। उदाहरण के कोलाहल में अपने कोड को कॉपी करने और es2015 सेट का चयन करने के लिए इस
handleChange = function handleChange(field) {
return function (e) {
e.preventDefault();
// Do something here
};
};
की तरह एक आउटपुट दे देंगे के लिए मुमकिन है 'एक => ख => ...' 'के रूप में एक => (ख पार्स करता है = > ...) ', यानी' फ़ंक्शन (फ़ील्ड) {रिटर्न फ़ंक्शन (ई) {e.preventDefault(); }; } 'आपके उदाहरण में। – melpomene
मुझे पता है कि यह शायद इसलिए है क्योंकि मैं उनके साथ गति नहीं कर रहा हूं लेकिन यह मेरे लिए बहुत ही अपरिहार्य दिखता है: \ –
कोड @belpomene सुझाव देता है कि https://babeljs.io/repl/ पारदर्शी में चिपकाया गया कोड। मुझे लगता है कि इसे एक उत्तर के रूप में पोस्ट किया जा सकता है। एक चीज जो मुझे नहीं मिलती है वह है कि वे इसे 'हैंडलैंड = e => {} ' – pawel