2010-11-12 23 views
5

में "इस" पहुँच मैं js में अभी शुरुआत कर रहा हूँ, और निम्न कोड से हैरान हूँ:जावास्क्रिप्ट प्रोटोटाइप और बंद

Foo = function(arg) { 
    this.arg = arg; 
}; 

Foo.prototype = { 
    init: function() { 
     var f = function() { 
      alert("current arg: " + this.arg); // am expecting "bar", got undefined 
     } 
     f(); 
    } 
}; 

var yo = Foo("bar"); 
yo.init(); 

मैं "वर्तमान आर्ग: बार" पाने के लिए उम्मीद थी, लेकिन "मिल गया वर्तमान तर्क: अपरिभाषित "। मैंने देखा है कि एक "सामान्य" चर में this.arg पहले प्रतिलिपि करने, और बंद करने में इस चर चर्चा करते हुए द्वारा काम करता है:

Foo.prototype = { 
    init: function() { 
     var yo = this.arg; 
     var f = function() { 
      alert("current arg: " + yo);   } 
     f(); 
    } 
}; 

Am मैं कुछ गलत कर, गलत उम्मीदों मिला है, या यह में से एक में गिर करता है जेएस डब्ल्यूटीएफ?

+0

'this.arg' को "सामान्य" चर में पहले कॉपी करने से पहले आपके फ़ंक्शन के लिए इसका अर्थ कुछ भी अलग नहीं होगा। – bobobobo

+0

@bobobobo तकनीकी रूप से सच है, लेकिन जब किसी ने यह संकेत दिया कि ऐसा होगा? जिस तरह से आपने phrased किया है वह भ्रामक हो सकता है। उन्होंने वास्तव में दूसरे उदाहरण में 'इस' का उपयोग नहीं किया; स्थानीय चर 'yo' का उपयोग करके एक बंदरगाह बनाता है जो' f' फ़ंक्शन के अंदर भी इच्छित ऑब्जेक्ट का संदर्भ रखता है। – theazureshadow

उत्तर

3

यह कैसे समारोह लागू किया गया था पर निर्भर करता है।

यदि कीवर्ड new के साथ आमंत्रण तो this वस्तु निर्माण किया जा रहा करने के लिए संदर्भित करता है (जो परोक्ष समारोह के अंत में वापस कर दिया जाएगा)।

यदि सामान्य कार्य के रूप में बुलाया जाता है, this वैश्विक window ऑब्जेक्ट को संदर्भित करता है।

उदाहरण:

// Constructor for Foo, 
// (invoke with keyword new!) 
function Foo() 
{ 
    this.name = "Foo" ; 
} 

myFoo = new Foo() ; 
alert('myFoo ' + myFoo.name + '\n' + 'window: ' + window.name) ; // window.name will be empty 

// now if we invoke Foo() WITHOUT keyword NEW 
// then all references to `this` inside the 
// function Foo will be to the 
// __global window object__, i.e. the global window 
// object will get clobbered with new properties it shouldn't 
// have! (.name!) 

Foo() ; // incorrect invokation style! 
alert('myFoo ' + myFoo.name + '\n' + 'window: ' + window.name) ; 

जावास्क्रिप्ट नहीं है "कंस्ट्रक्टर्स" दर असल, एक ही रास्ता जावास्क्रिप्ट को पता है कि अपने function वास्तव में एक "निर्माता" है invokation शैली (अर्थात् आप कीवर्ड new का उपयोग कर जब भी आप आह्वान है यह)

4

वेनिला फ़ंक्शन thiswindow का जिक्र करते हुए चलाए जाएंगे। कोड का आपका दूसरा भाग बंद करने का उपयोग करके इस समस्या को हल करने का एक आदर्श उदाहरण है।

(तुम भी call और apply का उपयोग एक विशेष संदर्भ के साथ एक समारोह कॉल करने के लिए कर सकते हैं।)

+0

आह, यह व्यवहार बताता है। धन्यवाद ! –

+0

यह बहुत खराब डाउनवॉट्स अज्ञात हैं। जो भी नीचे गिर गया, मैं एक टिप्पणी की सराहना करता हूं :) – theazureshadow

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