2015-03-18 7 views
7

मैं कई स्थानों में पैटर्न की इस तरह है कि कुछ कोड का सामना करना पड़ा:इसका उद्देश्य क्या है। SomFunction.call (यह, param);

this.someFunction.call(this, param); 

लेकिन यह मेरे लिए

this.someFunction(param) 

टाइपिंग की सिर्फ एक अधिक वर्बोज़ रास्ता पैटर्न कभी कभी अंदर प्रकट होता है लगता है एक समारोह जो कॉलबैक के रूप में प्रदान किया जाता है। यह प्रासंगिक होने पर बैकबोन का उपयोग होता है। कुछ इस तरह:

Backbone.View.extend({ 
    // other stuff ... 

    someFunction: function(param) { 
     // ... 
    }, 
    anotherFunction: function() { 
     this.collection.on("some_event", function() { 
      this.someFunction.call(this, param); 
     }); 
    } 
}); 

पैटर्न वास्तव में ऐसा प्रभाव है कि this.someFunction(param) के बराबर नहीं है या किसी को सिर्फ बंद सही this कब्जा नहीं के बारे में नर्वस थे है?

किसी भी अंतर्दृष्टि के लिए धन्यवाद!

+3

* "या कोई व्यक्ति बंद होने के बारे में सिर्फ घबरा गया था, यह सही 'कैप्चर नहीं कर रहा है' *' यह 'कार्यों के अंदर एक विशेष मूल्य है और गुंजाइश से प्रभावित नहीं है। (अपवाद: ES6 तीर फ़ंक्शन)। मुझे सामान्य फ़ंक्शन कॉल पर '.call' को प्राथमिकता देने के लिए यहां कोई कारण नहीं दिख रहा है। –

+0

दोनों शायद कुछ प्रकार के कोडिंग सम्मेलन के बराबर हैं। लिपियों को भी अक्सर obfuscated हैं। – kidwon

+0

ध्यान दें कि कॉल() का उपयोग करके कुछ ओवरहेड जोड़ता है और निष्पादन धीमा कर देता है, जो विशेष रूप से लूप में स्पष्ट होता है। कोड वास्तव में 'this.collection.on (" some_event ", this.someFunction.bind (यह, param)) के रूप में लिखा जा सकता है; 'जो समय से पहले _this_ लॉक करता है, जो कॉल() से तेज़ हो सकता है। हालांकि, बैकबोन _this_ का उपयोग करने के तरीके के आधार पर, आपको उस समय सही _this_ रखने के लिए किसी अन्य फ़ंक्शन() में बाध्य मान को डुप्लिकेट करने की आवश्यकता हो सकती है। – dandavis

उत्तर

2

मिल जाएगा पैटर्न वास्तव में ऐसा प्रभाव है कि this.someFunction(param) के बराबर नहीं है है?

नहीं, वे वास्तव में वही हैं। यह मानते हुए कि this.someFunction एक ऐसा फ़ंक्शन है जो .call को Function.prototype से प्राप्त करता है (लेकिन यह नाइट-पिकिंग है)।

ऐसा लगता है कि कोई भी सतर्क था, या कोड किसी ऐसे चीज का अवशेष है जिसने this का उपयोग नहीं किया। या शायद लेखक this-context-in-callbacks issue से अवगत थे लेकिन इसे सही तरीके से संभालने में विफल रहे।

1

मुझे आपके द्वारा प्रदान किए गए कोड में फ़ंक्शन कॉल के इस तरह के तरीके का उपयोग करने के कोई कारण नहीं दिखते हैं। यहाँ इस तरह प्रत्यक्ष समारोह कॉल का उपयोग (यदि आप तर्क के साथ कोई संशोधन की जरूरत है)

this.collection.on("some_event", this.someFunction, this); 

या

this.collection.on("some_event", function() { 
    this.someFunction(//some modified args) 
}, this); 

और मेरे .call के समुचित उपयोग के उदाहरण प्रदान करने देने के लिए बेहतर है। ज़रूर u've इस देखी गई:

Array.prototype.slice.call(arguments, 2); 

arguments रूप में, हम 'उधार' कर सकते हैं arguments साथ संचालित करने के लिए सरणी विधि एक सरणी नहीं है। आप पर slice फोन करने की कोशिश करेंगे, तो arguments आपको एक त्रुटि

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