फंक्शन कॉल
कार्य केवल एक प्रकार की वस्तु है।
सभी फ़ंक्शन ऑब्जेक्ट्स में कॉल और लागू करने के तरीके होते हैं जो उन फ़ंक्शन ऑब्जेक्ट को निष्पादित करते हैं जो उन्हें कहा जाता है।
जब कहा जाता है, तो इन विधियों का पहला तर्क उस ऑब्जेक्ट को निर्दिष्ट करता है जिसे thisफ़ंक्शन द्वारा निष्पादन के दौरान फ़ंक्शन द्वारा संदर्भित किया जाएगा - यदि यह nullया undefined, वैश्विक ऑब्जेक्ट, के windowलिए उपयोग किया जाता है this।
इस प्रकार, एक समारोह बुला ...
whereAmI = "window";
function foo()
{
return "this is " + this.whereAmI + " with " + arguments.length + " + arguments";
}
... कोष्ठक के साथ - foo()- foo.call(undefined)या के बराबर है foo.apply(undefined), जो प्रभावी रूप से foo.call(window)या के समान है foo.apply(window)।
>>> foo()
"this is window with 0 arguments"
>>> foo.call()
"this is window with 0 arguments"
अतिरिक्त तर्कों को callफ़ंक्शन कॉल के तर्क के रूप में पारित किया जाता है, जबकि फ़ंक्शन कॉल के लिए तर्क को applyनिर्दिष्ट करने के लिए एक एकल अतिरिक्त तर्क एक अर्रे जैसी वस्तु के रूप में निर्दिष्ट कर सकता है।
इस प्रकार, foo(1, 2, 3)के बराबर है foo.call(null, 1, 2, 3)या foo.apply(null, [1, 2, 3])।
>>> foo(1, 2, 3)
"this is window with 3 arguments"
>>> foo.apply(null, [1, 2, 3])
"this is window with 3 arguments"
यदि कोई कार्य किसी वस्तु का गुण है ...
var obj =
{
whereAmI: "obj",
foo: foo
};
... वस्तु के माध्यम से समारोह के लिए एक संदर्भ पहुँचने और कोष्ठकों के साथ यह बुला - obj.foo()- के बराबर है foo.call(obj)या foo.apply(obj)।
हालांकि, वस्तुओं के गुणों के रूप में आयोजित कार्य उन वस्तुओं के लिए "बाध्य" नहीं हैं। जैसा कि आप objऊपर की परिभाषा में देख सकते हैं , क्योंकि फ़ंक्शंस केवल एक प्रकार की वस्तु हैं, उन्हें संदर्भित किया जा सकता है (और इसे फ़ंक्शन कॉल के संदर्भ में पास किया जा सकता है या फ़ंक्शन कॉल से संदर्भ द्वारा लौटाया जा सकता है)। जब किसी फ़ंक्शन का संदर्भ पास किया जाता है, तो इसके बारे में कोई अतिरिक्त जानकारी नहीं दी जाती है कि इसे कहाँ से ले जाया गया है, जिसके कारण निम्नलिखित होता है:
>>> baz = obj.foo;
>>> baz();
"this is window with 0 arguments"
हमारे फ़ंक्शन संदर्भ bazके लिए कॉल, कॉल के लिए कोई संदर्भ प्रदान नहीं करता है, इसलिए यह प्रभावी रूप से उसी तरह है baz.call(undefined), इसलिए thisसंदर्भ को समाप्त करता है window। हम चाहते हैं bazपता चला है कि यह के अंतर्गत आता है obj, हम किसी भी तरह कि जानकारी जब प्रदान करने की आवश्यकता baz, कहा जाता है जो जहां के लिए पहला तर्क callया applyऔर संवृति भूमिका निभाते हैं।
स्कोप चेन
function bind(func, context)
{
return function()
{
func.apply(context, arguments);
};
}
जब कोई फ़ंक्शन निष्पादित किया जाता है, तो यह एक नया क्षेत्र बनाता है और इसमें किसी भी एन्कोडिंग स्कोप का संदर्भ होता है। जब अनाम फ़ंक्शन उपरोक्त उदाहरण में बनाया गया है, तो इसमें उस दायरे का संदर्भ है जो इसे बनाया गया था, जो कि bindगुंजाइश है। इसे "क्लोजर" के रूप में जाना जाता है।
[global scope (window)] - whereAmI, foo, obj, baz
|
[bind scope] - func, context
|
[anonymous scope]
जब आप किसी चर तक पहुँचने का प्रयास करते हैं तो इस "स्कोप चेन" को दिए गए नाम के साथ वैरिएबल खोजने के लिए चलाया जाता है - यदि वर्तमान स्कोप में वैरिएबल नहीं है, तो आप चेन में अगले स्कोप को देखते हैं, और इसी तरह जब तक आप नहीं पहुँचते। वैश्विक गुंजाइश। जब अनाम फ़ंक्शन वापस आ जाता है और bindनिष्पादित करना समाप्त हो जाता है, तो अनाम फ़ंक्शन में अभी भी bind's स्कोप' का संदर्भ है , इसलिए bindयह स्कोप "बहुत दूर" नहीं है।
उपरोक्त सभी को देखते हुए अब आपको यह समझने में सक्षम होना चाहिए कि निम्नलिखित उदाहरण में गुंजाइश कैसे काम करती है, और एक विशेष मूल्य के साथ "प्री-बाउंड" के आसपास एक फ़ंक्शन पास करने की तकनीक क्यों काम thisकरेगी जब इसे कहा जाता है:
>>> baz = bind(obj.foo, obj);
>>> baz(1, 2);
"this is obj with 2 arguments"
var signup = { onLoadHandler:function(){ console.log(this); return Type.createDelegate(this,this._onLoad); }, _onLoad: function (s, a) { console.log("this",this); }};