2011-10-19 22 views
13

मुझे एक जावास्क्रिप्ट एप्लिकेशन मिला है जो कई कॉलबैक का उपयोग करता है। एक ठेठ कार्य एक कॉलबैक लेगा, और इसे एक और कॉलबैक के साथ लपेटें।मुझे कॉल() बनाम फ़ंक्शन को सीधे आवेदक का उपयोग कब करना चाहिए?

Namespace.foo = function(arg, their_on_success) { 
    var my_on_success = function(result) { 
     console.log('my_on_success() called'); 
     if('function' === typeof their_on_success) { 
       their_on_success(result); 
     } 
    } 
    something(arg, my_on_success); 
}; 

ऊपर के उदाहरण को देखते हुए, जब ऐसा करना चाहिए इस तरह के एक सेटअप हमें देशी call() विधि (दूसरा तर्क के रूप में परिणाम वर गुजर) के बजाय their_on_success() लागू और समारोह मंगलाचरण के माध्यम से परिणाम में गुजर से? आप समारोह के अंदर this का मान सेट करना चाहते हैं है

var obj = {a: 0}; 
method.call(obj, "parameter"); 
function method(para) { 
    this.a == 0; // true <-- obj is now this 
} 

उत्तर

19

कॉल() फ़ंक्शन का इस मान बदलने के लिए प्रयोग किया जाता है ।

ठीक है, मुझे लगता है कि apply अन्य मामलों में उपयोगी हो सकता है क्योंकि यह पैरामीटर की एक सरणी स्वीकार करता है।

7

एकमात्र कारण call (या apply) का उपयोग करने के लिए:

+1

'लागू' के लिए मुख्य मामला परिवर्तनीय तर्कों से निपटने पर है, इसलिए आप इसे केवल 'तर्क' पास कर सकते हैं। –

3

एक समारोह के call() विधि का उपयोग करके आप उद्देश्य यह है कि समारोह के निष्पादन के दौरान this के रूप में कार्य करने के लिए बाध्य कर रहा है बदल करने की अनुमति देता है - यह भी, संदर्भ

their_on_success.call(myContext, results) 

कहा जाता है लेकिन अगर आपके कॉलबैक फ़ंक्शन this पर निर्भर नहीं है, इससे कोई फर्क नहीं पड़ता कि आप इसे किस तरह से कॉल करते हैं।

3

एक अच्छा उदाहरण है जब किसी फ़ंक्शन को लागू करने के लिए कॉलबैक की आवश्यकता होती है। ओओ कोड लिखते समय, आप कॉलर को उस संदर्भ को निर्दिष्ट करने की अनुमति देना चाहते हैं जिसे कॉलबैक कहा जाएगा।

function validateFormAjax(form, callback, context) { 
    // Using jQuery for simplicity 
    $.ajax({ 
    url: '/validateForm.php', 
    data: getFormData(form), 
    success: function(data) { 
     callback.call(context, data); 
    } 
    }); 
} 

नोट है कि मेरे उदाहरण सिर्फ $.ajax कॉल करने के लिए संदर्भ पैरामीटर पारित करके लागू किया जा सकता है, लेकिन है कि आप call

1

एक और मामला का उपयोग कर कॉल उपयोग करने के लिए (के बारे में ज्यादा नहीं दिखाया जाएगा) जब आप है ऐसे माहौल में हैं जहां आप इस बात पर भरोसा नहीं कर सकते कि ऑब्जेक्ट की अपनी विधि को प्रतिस्थापित नहीं किया गया है या आप जानते हैं कि वास्तव में उस विधि में नहीं है जिस पर आप इसे चलाने के लिए चाहते हैं। हैऑनप्रोपर्टी अक्सर ऐसी विधि होती है - ऐसे कई स्थान होते हैं जहां जावास्क्रिप्ट ऑब्जेक्ट्स की अपनी स्वयं की ओनप्रॉपर्टी विधि नहीं हो सकती है, इसलिए इसेऑनप्रॉपर्टी.call (obj, propertyName) के रूप में आवेदक समझदार है।

+1

मुझे लगता है कि आप क्या कह रहे हैं लेकिन मुझे लगता है कि इसे बेहतर किया जा सकता है। कुछ ऐसा: जावास्क्रिप्ट आपको किसी भी प्रोटोटाइप को निर्दिष्ट नहीं करता है ('Object.create (null)'), मूल वस्तुओं के प्रोटोटाइप पर गुणों को ओवरराइड करें, या ऑब्जेक्ट पर भी। इसलिए, सुरक्षित होने के लिए, किसी को बुलेट प्रूफ होने के लिए 'ऑब्जेक्ट.प्रोटोटाइप.hasOwnProperty.call (obj,' someProp ')' का उपयोग करना चाहिए। –

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