2011-10-05 12 views
6

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

शायद कुछ कोड आप दिखाना चाहिए कि मैं क्या करने की कोशिश कर रहा हूँ:

function MulticastDelegate() { 
    var handlers = []; 

    this.event = { 
     subscribe: function(handler) { 
      if (typeof(handler) === 'function') { 
       handlers.push(handler); 
      } 
     }, 
     unsubscribe: function(handler) { 
      if (typeof(handler) === 'function') { 
       handlers.splice(handlers.indexOf(handler),1); 
      } 
     } 
    } 

    this.execute = function() { 
     var args = Array.prototype.slice.call(arguments); 
     for (var handler in handlers) { 
      // call this with the original context of the handler 
      handlers[handler].apply(null, args); 
     } 
    } 
} 

अनिवार्य रूप से, मैं apply के व्यवहार चाहते हैं - तर्क की एक सरणी से पारित करने की क्षमता - call के व्यवहार के बिना - बदल रहा है संदर्भ जिसके तहत एक समारोह निष्पादित करता है।

उत्तर

5

फ़ंक्शन के "मूल संदर्भ" जैसी कोई चीज़ नहीं है। तो

subscribe: function(handler, context) { 
    if (typeof(handler) === 'function') { 
     handlers.push([handler, context]); 
    } 
}, 

और, ज़ाहिर है,

handlers[handler][0].apply(handlers[handler][1], args); 

वैकल्पिक रूप से (यह मैं क्या कर सकता है), फोन करने वाले के लिए छोड़ यकीन है कि हैंडलर है बनाने के लिए: आप इस तरह कुछ करने के लिए होता है सही संदर्भ। उदाहरण के लिए, delegate.subscribe(this.foo) के बजाय,

var self = this 
delegate.subscribe(function() { self.foo() }) 

या, Function.prototype.bind का उपयोग कर,

delegate.subscribe(this.foo.bind(this)) 
+0

मुझे लगता है कि तुम यहाँ का वर्णन एकदम वही है जिसे Backbone.js इसकी घटना बंधन ढांचे में करता है: http://documentcloud.github.com /backbone/docs/backbone.html#section-12 – nrabinowitz

+0

@nrabinowitz हाहा! जीएमटीए :) –

+0

मुझे लगता है कि आप 'var self' विधि या इसी तरह के कुछ का उपयोग करके, कॉलर को उस संदर्भ का ख्याल रखने के बारे में सही हैं, जिसके तहत इसे निष्पादित किया गया है। फिर मैं 'इस' के लिए एक और उपयुक्त वस्तु प्रदान कर सकता हूं। –

0

यह हो सकता है का कहना है, कि .bind मामले का समाधान होगा? http://documentcloud.github.com/underscore/#bind
इस मामले में, आप एक समारोह मूल संदर्भ के लिए 'आबद्ध' प्राप्त

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