2012-11-08 36 views
23

कुछ फ़ंक्शन हैं, जो कुछ लंबा काम करते हैं और यह कॉलबैक प्रदान करता है।अज्ञात फ़ंक्शन के संदर्भ को कैसे पास किया जाए?

someFunc: function(argument, callback, context) { 
    // do something long 

    // call callback function 
    callback(context); 
} 

आवेदन में मैं इस समारोह

someFunc('bla-bla', function (context) { 
    // do something with this scope 
    context.anotherFunc(); 
}, this); 

कैसे context पैरामीटर गुजर बिना कॉलबैक फ़ंक्शन लागू करने के लिए प्रयोग करते हैं?

इस तरह कुछ की आवश्यकता है:

someFunc('bla-bla', function() { 
    // do something with this scope 
    this.anotherFunc(); 
}, this); 
+1

तो आपके अंतिम उदाहरण में ऐसा प्रतीत होता है कि आप संदर्भ (कम से कम कुछ के लिए) पास कर रहे हैं, क्या आप तर्कसंगत हैं कि अगर इसका नाम नहीं है तो क्या आप उत्सुक हैं? –

+0

आप पैरामीटर पास कर रहे हैं, आप बस इसका उपयोग नहीं कर रहे हैं। और मुझे समझ में नहीं आता क्यों। – bfavaretto

+2

@bfavaretto: ओपी इसे कॉलबैक में पास करके इसका उपयोग कर रहा है ताकि कॉलबैक बाहरी 'इस' मान के तरीकों का लाभ उठा सके। तो सवाल यह है कि आखिरी कोड ब्लॉक कैसे प्राप्त करें ... कॉलबैक में उचित 'यह' प्राप्त करना, इसलिए इसे तर्क के रूप में पारित करने की आवश्यकता नहीं है। –

उत्तर

37

स्वीकृत उत्तर कुछ हद तक पुराना लगता है। मान लें कि आप अपेक्षाकृत आधुनिक ब्राउज़र पर काम कर रहे हैं, आप vanilla javascript में Function.prototype.bind का उपयोग कर सकते हैं। वैकल्पिक रूप से, यदि आप underscore या jQuery का उपयोग कर रहे हैं, तो आप क्रमशः _.bind या $.proxy का उपयोग कर सकते हैं (यदि आवश्यक हो तो call/apply पर फ़ॉलबैक होगा)। http://jsfiddle.net/yMm6t/1/ (ध्यान दें:: सुनिश्चित करें कि डेवलपर कंसोल खुला है, या आप नहीं देख सकेंगे

// simple function that takes another function 
// as its parameter and then executes it. 
function execute_param(func) { 
    func(); 
} 

// dummy object. providing an alternative context. 
obj = {}; 
obj.data = 10; 

// no context provided 
// outputs 'Window' 
execute_param(function(){ 
    console.log(this); 
}); 

// context provided by js - Function.prototype.bind 
// src: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/bind 
// outputs 'Object { data=10 }'' 
execute_param(function(){ 
    console.log(this); 
}.bind(obj)); 

// context provided by underscore - _.bind 
// src: http://underscorejs.org/#bind 
// outputs 'Object { data=10 }' 
execute_param(_.bind(function(){ 
    console.log(this); 
},obj)); 

// context provided by jQuery - $.proxy 
// src: http://api.jquery.com/jQuery.proxy/ 
// outputs 'Object { data=10 }' 
execute_param($.proxy(function(){ 
    console.log(this); 
},obj)); 

आप एक jsfiddle यहाँ में कोड पा सकते हैं:

यहाँ इन तीन विकल्पों में से एक साधारण प्रदर्शन है कोई आउटपुट)

+0

हां। अब मैं हर जगह अंडरस्कोर का उपयोग कर रहा हूं :) – acelot

+0

@PiONeeR हाँ, मैं भी :) आप पुनर्विचार करना चाहते हैं कि स्वीकार्य उत्तर क्या होना चाहिए। – EleventyOne

+8

यह स्वीकार्य उत्तर होना चाहिए। – Gamak

13

उपयोग Function.prototype.call एक समारोह आह्वान और मैन्युअल कि समारोह के this मान सेट करने के।

someFunc: function(argument, callback, context) { 
    callback.call(context); // call the callback and manually set the 'this' 
} 

अब आपके कॉलबैक की अपेक्षा this मान है।

someFunc('bla-bla', function() { 
    // now 'this' is what you'd expect 
    this.anotherFunc(); 
}, this); 

बेशक

आप .call मंगलाचरण में सामान्य की तरह तर्क पारित कर सकते हैं।

callback.call(context, argument); 
संबंधित मुद्दे

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