2011-11-22 18 views
7

मैं jQuery के साथ काम करने से स्वयं निष्पादन कार्यों से बहुत परिचित हूं।जावास्क्रिप्ट स्वयं निष्पादन कार्य - अंतर क्या है?

(function($) { /* do stuff */ })(jQuery); 

आज मैं backbone.js स्रोत पढ़ने और पाया है कि वे करते हैं यह किया गया था:

(function() { /* do stuff */ }).call(this); 

इस एक ही बात को प्राप्त है? कोड की निम्नलिखित 2 पंक्तियां वही काम करती हैं?

(function($) { /* do stuff */ })(jQuery); 
(function($) { /* do stuff */ }).call(jQuery); 

उत्तर

12

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

(function(x){ console.log(this,x); })(jQuery); 
//--> [window object] 
//--> [jQuery object] 

(function(x){ console.log(this,x); }).call(jQuery); 
//--> [jQuery object] 
//--> undefined 

(function(x){ console.log(this,x); }).call(jQuery, jQuery); 
//--> [jQuery object] 
//--> [jQuery object] 

अधिक जानकारी के लिए Function.prototype.call और Function.prototype.apply देखते हैं। call() के माध्यम से this का मान सेट बिना

v = 'oh noes!' 
var o = { 
    v : 42, 
    f : function(){ 
    console.log(this.v); 
    (function(){ console.log(this.v) })(); 
    } 
}; 
o.f(); 
// --> 42 
// --> 'oh noes!' 

, स्वयं बुला समारोह ग्लोबल (विंडो) के दायरे में लाया जाता है:

यहां एक मामला है जहाँ आप call तकनीक का उपयोग करना चाहते हो सकता है , वर्तमान वस्तु नहीं।

+1

हालांकि अगर यह 'कॉल (jQuery, jQuery)' था, तो यह दोनों सेट करेगा। – zzzzBov

+0

@Phrogz धन्यवाद। मैं समझ गया। – modernzombie

+0

@zzzzBov दोनों [jQuery ऑब्जेक्ट] होंगे, सही? – modernzombie

3

उनके मामले में:

(function() { /* do stuff */ }).call(this); 

... वे सुनिश्चित करें कि समारोह this के लिए एक विशिष्ट मूल्य के साथ कहा जाता हो जाता है कि कर रहे हैं (जैसे, this समारोह के भीतर की this बाहर के रूप में ही किया जाएगा समारोह)।

आपके मामले में: क्योंकि आप इसे कुछ भी है कि सेट this कर बिना कहा है

(function($) { /* do stuff */ })(jQuery); 

... this अपने समारोह के भीतर वैश्विक वस्तु हो जाएगा, और इसलिए वैश्विक वस्तु को this चूक (window, ब्रॉवर्स पर)।

जावास्क्रिप्ट में, this पूरी तरह से एक फ़ंक्शन कहलाता है द्वारा सेट किया गया है। वहाँ दो मुख्य तरीके हैं:

  1. अभिव्यक्ति है कि यह एक वस्तु की संपत्ति से प्राप्त करता है, उदाहरण के लिए के हिस्से के रूप कार्यप्रणाली को कॉल करके

    obj.foo(); // Or `obj["foo"](); 
    

    उस मामले में, foo करने के लिए कॉल के भीतर, thisobj के पास भेजेगा।

  2. के माध्यम से कार्यप्रणाली को कॉल करके अपनी निर्मित call या apply तरीके:

    var obj = {name: "Fred"}; 
    function foo(salutation, punctuation) { 
        alert(salutation + " " + this.name + punctuation); 
    } 
    foo.call(obj, "Hi", "!"); // alerts "Hi Fred!" 
    foo.apply(obj, ["Hi", "!"]); // Also alerts "Hi Fred!" 
    

    call और apply कैसे आप समारोह आप कॉल कर रहे में पारित करने के लिए तर्क निर्दिष्ट है के बीच फर्क सिर्फ इतना है: call के साथ , आप उन्हें this मान के बाद बस अलग तर्क के रूप में सूचीबद्ध करते हैं; apply के साथ, आप उन्हें एक सरणी के रूप में आपूर्ति करते हैं।

+2

मेरी इच्छा है कि मैं बड़ी जानकारी के लिए +2 या +3 कर सकता हूं। भ्रमित/गलत शब्दावली के लिए – Phrogz

-2

.call फ़ंक्शन को बंद करने के दायरे में रखता है।

तो अगर आप ऐसा किया:

(function($) { /* do stuff */ }).call(jQuery); 

$ होगा undefined

+1

-1; 'कॉल' के पास बंद होने के साथ कुछ लेना देना नहीं है। – Phrogz

1

पहले पैरामीटर $ के रूप में गुजरता है jQuery। दूसरा फंक्शन के अंदर jQuery को 'यह' चर बनाता है।

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