2013-03-28 10 views
32
var obj = { 
    x: 81, 
    getX: function() { 
    console.log(this.x) 
    } 
}; 
var getX = obj.getX.bind(obj);//use obj as 'this'; 
getX();//81 
var getX = function(){ 
    obj.getX.apply(obj); 
} 
getX();//also 81 

बाइंड और कॉल/लागू का उपयोग बहुत समान दिखता है, मैं जानना चाहता हूं कि उनके बीच क्या अंतर है। उपरोक्त दो getX फ़ंक्शन एक जैसा है?'कॉल/लागू' और 'बाइंड'

+0

जांचें http://stackoverflow.com/questions/1986896/what-is-the-difference-between-call -और-लागू करें या http://stackoverflow.com/questions/15455009/js-call-apply-vs-bind – Rakesh

उत्तर

37

bind एक फ़ंक्शन देता है जो मूल फ़ंक्शन की तरह कार्य करेगा लेकिन this पूर्वनिर्धारित होगा। आमतौर पर इसका उपयोग तब किया जाता है जब आप किसी ईवेंट हैंडलर या अन्य एसिंक कॉलबैक में कोई फ़ंक्शन पास करना चाहते हैं।

call और apply आपको this के मूल्य और फ़ंक्शन प्राप्त होने वाले किसी भी तर्क को तुरंत निर्दिष्ट करने के लिए एक फ़ंक्शन को कॉल करेगा।

आपका दूसरा उदाहरण अज्ञात फ़ंक्शन को परिभाषित करता है जो apply पर कॉल करता है। यह एक आम पैटर्न है; bind उसमें एक मानक कार्यान्वयन प्रदान करता है जो आपको इसे एक साधारण फ़ंक्शन कॉल (इस प्रकार लिखने के लिए तेज़ और आसान) के साथ करने की अनुमति देता है।

+4

इसके अलावा, आप 'बाइंड()' कॉल में तर्क निर्दिष्ट कर सकते हैं जो तर्क सूची में प्रीपेड किया जाएगा आप परिणामस्वरूप फ़ंक्शन को कॉल करते हैं, उदाहरण के लिए 'फ़ंक्शन ऐड (ए, बी) {ए + बी} वापस करें; var plus5 = add.bind (शून्य, 5); console.log (प्लस 5 (6)/* 11 * /) ' – thejh

33

.call() - कॉल निर्दिष्ट तर्क

.apply() के साथ एक ही समारोह - तर्क एक सरणी

.bind() में निर्दिष्ट के साथ एक ही फ़ंक्शन को कॉल - एक पूर्व निर्धारित के साथ एक ही समारोह शरीर के साथ एक नया कार्य बनाता है, this (पहला तर्क) का मान और उस कार्य को लौटाता है।

सभी मामलों में, पहला तर्क फ़ंक्शन के अंदर this के मान के रूप में उपयोग किया जाता है।

+1

आप 'कॉल', 'लागू करें', और 'बाइंड' के बारे में बात कैसे किए बिना बात कर सकते हैं ?! –

+0

@ टीजे.क्रॉडर - उस बिट को भी जोड़ा गया .. :) – techfoobar

+0

'bind()' 'फ़ंक्शन को कॉल नहीं करता है। उस पर refrasing पर विचार करें। – lqc

5

अंतर यह है कि आप कॉल कैसे करते हैं। यदि आप एक बाध्य समारोह नहीं है, तो

getx(); 

, और आप this सेट करना चाहते हैं, तो आप ऐसा: आप bind का उपयोग किया है एक बाध्य this मूल्य के साथ एक समारोह वापस पाने के लिए, आप बस फ़ंक्शन को कॉल करें

someFunction.call(objectToUseAsThis, arg1, arg2); 
// or 
someFunction.apply(objectToUseAsThis, [arg1, arg2]); 

ध्यान दें कि आप (अपने getX) की तरह एक बाध्य समारोह है, उस पर call का उपयोग कर अगर, व्यर्थ है क्योंकि this आपूर्ति सिर्फ बाध्य this द्वारा ओवरराइड हो जाएगी: call या apply साथ । (apply का उपयोग करना उपयोगी हो सकता है, यदि आपके पास तर्कों के रूप में गधे के रूप में गधे बनाना चाहते हैं।)

+0

'लागू' व्यर्थ नहीं है क्योंकि आपके पास तर्कों की एक श्रृंखला हो सकती है और आप इसे सीधे नहीं बुला सकते हैं। – Neil

+0

@Neil: ठीक है, उचित बिंदु। –

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