2012-05-09 5 views
16

मैं Function.prototype.bind का उपयोग कर करी और अन्य तकनीकों के बारे में अपना सिर लपेट रहा हूं।
कुछ स्थितियों में फ़ंक्शन स्कोप (यानी, this मान) को बदलने के लिए यह बहुत उपयोगी लगता है।क्या मुझे जावास्क्रिप्ट में बाध्य फ़ंक्शन से एक अनबाउंड फ़ंक्शन मिल सकता है?

हालांकि it looks like you can't change the scope with bind एक बार आप पहले से ही ऐसा किया:

function f = obj.method.bind(42); 
function g = obj.method.bind('Hi'); 

function f2 = f.bind('Hi'); // “this” is still 42 

यह बिल्कुल एक बाध्य समारोह से मूल अनबाउंड समारोह को पुनः प्राप्त करना संभव है?

+4

क्या आपने कोशिश की है? –

+0

@ मार्टिन: मैं अभी एक बेवकूफ बना रहा हूँ। यह किसी ऐसे व्यक्ति को बहुत ही सरल सवाल जैसा लगता है जो उत्तर जानता है, इसलिए मैंने पूर्व शोध के बिना एक प्रश्न क्यों पोस्ट किया। –

+0

@ मार्टिन: मैं बस [मेरी धारणाओं की जांच की] (http://jsfiddle.net/dXq2E/) और ऐसा लगता है कि मैं दो बार 'बाइंड' के साथ दायरा नहीं बदल सकता। तो, क्या यह बिल्कुल संभव है? क्या कोई 'अनबिंड' है? –

उत्तर

15

क्या bind विधि मूल रूप से करता है (, नहीं बिल्कुल क्योंकि तर्क संदर्भ बाहर करने के लिए कटा हुआ कर रहे हैं) की तरह कुछ है: मूल रूप से यह एक और समारोह जो अपने आप में दिए गए संदर्भ और तर्क के साथ कॉल करेंगे लौटा रहा है

function bind(context) { 
    var self = this; 
    return function() { 
     self.apply(context, arguments); 
    } 
} 

तो । आप तो bind इसे फिर से, तो आप इस नव निर्मित समारोह है, जो के रूप में अगर bind तरह लागू किया गया था हो जाएगा बाध्यकारी देगा:

function bind(context) { 
    var self = this; 
    return function() { 
     self.apply(context, arguments); 
    }.bind(otherContext); 
} 

लेकिन क्योंकि भीतरी समारोह को बंद करने के रूप में कार्य करता है बाँध द्वारा दिया जहां मूल संदर्भ पहले एक बांध दिया गया है (self), कि आपके फ़ंक्शन के साथ संदर्भ होगा वास्तव में निष्पादित किया जाएगा।

22

मैंने सोचा कि तस्वीर के साथ Win32's answer को चित्रित करना उपयोगी होगा।

bind द्वारा उत्पन्न एक रैपर सुनिश्चित करता है कि आपके फ़ंक्शन को दिए गए संदर्भ से कोई फर्क नहीं पड़ता कि कोई फर्क नहीं पड़ता।
इस तरह के रैपर हमेशा अपने संदर्भ को अनदेखा करेंगे।

रैपर की एक श्रृंखला को देखते हुए, किसी भी संदर्भ में लेकिन सबसे नीचे खो गया है।
इसलिए, bind का उपयोग करके सेट किए जाने के बाद संदर्भ को बदलने का कोई तरीका नहीं है।

Chained bind calls

+0

अच्छा दृश्य स्पष्टीकरण :) – Win32

+0

कूल स्पष्टीकरण @ डैन अब्रामोमो !! –

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