2015-10-23 7 views
41

मैं थोड़ी देर के लिए ES6 के साथ प्रयोग कर रहा हूं, और मैं थोड़ी सी समस्या के लिए आया हूं।क्या आप तीर कार्यों को बांध सकते हैं?

मुझे वास्तव में तीर फ़ंक्शंस का उपयोग करना पसंद है, और जब भी मैं कर सकता हूं, तो मैं उनका उपयोग करता हूं।

हालांकि, ऐसा लगता है कि आप उन्हें बाध्य नहीं कर सकते!

var f =() => console.log(this); 

यहाँ वस्तु मैं करने के लिए समारोह के लिए बाध्य करना चाहते है:

यहाँ समारोह है यहाँ

var o = {'a': 42}; 

और मैं कैसे बाँध होता है fo रहे हैं:

var fBound = f.bind(o); 

और फिर मैं केवल fBound पर कॉल कर सकता हूं:

fBound(); 

कौन सा होगा उत्पादन इस (o वस्तु):

{'a': 42} 

कूल! लवली! सिवाय इसके कि यह काम नहीं करता है। o ऑब्जेक्ट को आउटपुट करने के बजाय, यह window ऑब्जेक्ट आउटपुट करता है।

तो मैं जानना चाहता हूं: क्या आप तीर कार्यों को बांध सकते हैं? (और यदि हां, तो कैसे?)


मैंने Google क्रोम 48 और फ़ायरफ़ॉक्स 43 में उपरोक्त कोड का परीक्षण किया है, और नतीजा वही है।

+16

तीर कार्यों के पूरे मुद्दे है कि वे 'अपने माता पिता के दायरे से this' का उपयोग करें। – loganfsmyth

उत्तर

51

आप एक तीर फ़ंक्शन को "रिबाइंड" नहीं कर सकते हैं। इसे हमेशा संदर्भ के साथ बुलाया जाएगा जिसमें इसे परिभाषित किया गया था। बस एक सामान्य समारोह का उपयोग करें।

ECMAScript 2015 Spec से:

तर्क, सुपर करने के लिए किसी भी संदर्भ में, इस, या एक ArrowFunction भीतर new.target एक lexically संलग्न वातावरण में एक बाध्यकारी दिखाई देनी चाहिए। आम तौर पर यह तुरंत संलग्न कार्य का कार्य पर्यावरण होगा।

6
MDN से

:

एक तीर समारोह अभिव्यक्ति समारोह भाव की तुलना में एक छोटा वाक्यविन्यास है और lexically बांधता है इस मूल्य (अपने स्वयं के इस, तर्क, सुपर बाध्य नहीं है, या new.target)। तीर कार्य हमेशा अज्ञात होते हैं।

इसका मतलब है कि आप इसे पसंद करने के लिए कोई मूल्य नहीं लगा सकते हैं।

3

मैंने दो दिन पहले एक ही प्रश्न पूछा था।

this पहले से ही बाध्य होने के बाद से आप कोई मान नहीं लगा सकते हैं।

Binding different this scope to ES6 => function operator

+3

"चूंकि यह पहले से ही बाध्य है" - नियमित कार्यों में 'यह' भी बाध्य है। मुद्दा यह है कि तीर कार्यों में इसका कोई ** स्थानीय ** बाध्यकारी नहीं है। – zeroflagL

5

सालों के लिए, जे एस डेवलपर्स संदर्भ बंधन के साथ संघर्ष किया, पूछा क्यों this जावास्क्रिप्ट में, इतना भ्रम पिछले कुछ वर्षों में कारण संदर्भ बंधन और अधिकांश में जावास्क्रिप्ट में this का अर्थ और this के बीच अंतर करने के लिए बदल अन्य ओओपी भाषाओं में से।

यह सब मुझे पूछने के लिए प्रेरित करता है, क्यों, क्यों! आप एक तीर समारोह को पुनर्जीवित क्यों नहीं करेंगे! उन सभी मुद्दों और भ्रम को हल करने के लिए विशेष रूप से बनाए गए और bind या call या फ़ंक्शन के दायरे को संरक्षित करने के लिए जो भी अन्य तरीका उपयोग करने से बचें।

टी एल; डॉ

नहीं, आप तीर कार्यों rebind नहीं कर सकते।

+0

एक क्लीनर और तेज वाक्यविन्यास प्रदान करने के लिए तीर कार्यों को सबसे पहले बनाया गया था। लैम्ब्डा-कैलकुस सोचो। ओओ-zealots बहुत बुरा है कि कार्यात्मक जेएस प्रोग्रामर के जीवन को परेशान करने के लिए आविष्कार संदर्भ निर्दिष्ट करने के लिए स्वतंत्रता को दूर करने का अवसर पकड़ लिया। –

2

पूरा होने के लिए, आप री-बाइंड तीर फ़ंक्शंस कर सकते हैं, आप बस this का अर्थ नहीं बदल सकते हैं।

bind अभी भी समारोह तर्क के लिए मान है:

((a, b, c) => { 
    console.info(a, b, c) // 1, 2, 3 
}).bind(undefined, 1, 2, 3)() 

इसे यहाँ का प्रयास करें: http://jsbin.com/motihanopi/edit?js,console

+0

क्या इस ऑब्जेक्ट को संदर्भित किए बिना (तीर) फ़ंक्शन को बाध्य करने के लिए किसी भी वस्तु का पता लगाने या उपयोग करने का कोई तरीका है (जो निश्चित रूप से परिभाषित किया गया है)? – towerofnix

+1

संदर्भ के लिए एक तर्क का प्रयोग करें: ((संदर्भ) => { कुछ अन्य निष्पादन। लागू (संदर्भ) })। बाइंड (WillBe अनदेखा, संदर्भ)() – cvazac

संबंधित मुद्दे

 संबंधित मुद्दे