2011-06-18 11 views
17

के रूप में यहां कहा:जावास्क्रिप्ट में फंक्शन। बाइंड बनाम क्लोजर: कैसे चुनें?

http://jqfundamentals.com/book/index.html

क्लोजर भी इस कीवर्ड, जो प्रत्येक दायरे के लिए अद्वितीय है के साथ मुद्दों को हल करने के लिए इस्तेमाल किया जा सकता है। यह तंत्र, विशेष रूप से उपयोगी हो सकता है जब कॉलबैक के साथ काम हालांकि उन मामलों में, यह अक्सर Function.bind, जो गुंजाइश ट्रेवर्सल के साथ जुड़े किसी भी भूमि के ऊपर से बचने जाएगा उपयोग करने के लिए बेहतर है।

लेकिन यह वास्तव में यह नहीं कहता कि दोनों मामलों के बीच अंतर कैसे करें। मैं वास्तव में समझ में नहीं आता कि लेखक का अर्थ है "स्कोप ट्रैवर्सल से जुड़े किसी भी ओवरहेड से बचें।" क्या तुम समझा सकते हो?

+5

बंद करने की विधि दो बार तेजी से प्रतीत होती है http://jsperf.com/bind-vs-closure-performace – sbr

+2

लिंक टूटा हुआ है। "क्षमा करें, आप जो खोज रहे हैं वह यहां नहीं है" – Luke

+0

@sbr 25 x तेजी से मेरे कंप्यूटर पर – Supersharp

उत्तर

9

(स्वयं के साथ = इस; लाइनों की एक जोड़ी ऊपर) ऊपर

console.log(self.myName, this.myName); 

लिंक में उदाहरण में इस लाइन पर एक नजर डालें। बाहरी फ़ंक्शन विधि को बंद करने वाला क्लोजर, एक अलग दायरे में मौजूद है, यही कारण है कि बाहरी ऑब्जेक्ट ऑब्जेक्ट से यह एक अलग मूल्य है। (Self.myName! = This.myName)

स्कोप ट्रेवर्सल का मतलब है, जब आप एक मूल्य (चर, वस्तु) है कि एक अलग दायरे में मौजूद है, इसलिए अतिरिक्त भूमि के ऊपर (कोड निष्पादित करने के लिए धीमी गति से हो जाता है) जोड़ा जाता है हड़पने के लिए पहुँच रहे हैं ।

बांध का उपयोग करके, आप एक मौजूदा दायरे के साथ एक समारोह बुला रहे हैं, ताकि स्कोप ट्रैवर्सल न हो।

+2

* कोड निष्पादित करने के लिए धीमा हो जाता है * - यह एसबीआर की टिप्पणी और अन्य SO प्रश्नों से संकेत मिलता है: http://stackoverflow.com/questions/17638305/why-is-bind-slower-than-a-closure – adelphus

+0

कैन आप जोड़े गए कोड की रेखा के आस-पास अधिक संदर्भ प्रदान करते हैं?मूल प्रश्न में प्रदान किया गया लिंक अब मान्य नहीं है। – Luke

+0

इसके अलावा, क्या आप किसी भी प्रकार के दस्तावेज या साक्ष्य प्रदान कर सकते हैं, "जब आप किसी भिन्न दायरे में मौजूद मूल्य को पकड़ने के लिए पहुंच रहे हैं, तो अतिरिक्त ओवरहेड जोड़ा जाता है"। @ एसबीआर द्वारा उपरोक्त प्रदर्शन जांच से पता चलता है कि बंद होना वही है - यहां तक ​​कि थोड़ा तेज़। – Luke

7

क्या यह जिक्र है बनाम

obj.doSomething = function() { 
    setTimeout((function() { 
    // this is the obj 
    this.doSomethingElse(); 
    }).bind(this), 50); 
}; 

Benchmark इस

obj.doSomething = function() { 
    var that = this; 
    setTimeout(function() { 
    // this is the window 
    // that is the obj 
    that.doSomethingElse(); 
    }, 50); 
}; 

तरह बातें कर रहे हैं। क्रोम में कोई उल्लेखनीय अंतर नहीं।

+0

चूंकि फ़ंक्शन कॉल माइक्रोसेकंड में होती है और सेटटाइमआउट 10 मिलीसेकंड + है, क्या सेटटाइमआउट के कम समय के संकल्प के कारण अंतर की कमी नहीं है? – jpillora

+0

हां, लेकिन दोनों में से कौन सा सर्वश्रेष्ठ अभ्यास माना जाता है (यानी "पढ़ने के लिए सबसे अच्छा")? –

+0

@ लिनसयूनेबैक जिसे व्यक्तिगत वरीयता माना जाता है। मैं पूरी तरह से जावास्क्रिप्ट में 'इस' का उपयोग करने से बचता हूं क्योंकि दोनों प्रकार बदसूरत हैं। – Raynos

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