2012-03-20 6 views
7

इस कोड पर विचार करें। अंतिम पंक्ति को बदलना:इनलाइन इंस्टेंस निर्माण अलग क्यों व्यवहार करता है?</p> <pre><code>function Foo() { } Foo.prototype.alert = function() { alert(this); } (new Foo()).alert(); </code></pre> <p>जब मार डाला (jsfiddle में), चेतावनी से पता चलता है कि 'इसी' विंडो वस्तु है:

var foo = new Foo(); 
foo.alert(); 

अपेक्षा के अनुसार काम करता है।

अंतर क्यों है?

+0

जेएसफ़ील्ड डेमो। लगता है कि दूसरा 'अलर्ट' निष्पादित नहीं होता है: http://jsfiddle.net/sf3M3/ –

उत्तर

4

ऐसा लगता है कि आप एक सेमी-कोलन याद कर रहे हैं:

function Foo() { 
} 

Foo.prototype.alert = function() { 
    alert(this); 
}; //Semi-colon here! 

(new Foo()).alert();​ 

यहाँ एक fiddle जिसमें यह आपकी अपेक्षा के अनुसार काम करने के लिए प्रकट होता है है।

क्या वास्तव में हो रहा है कि alert विधि तुरंत बुलाया जाता है, Foo यह में पारित कर दिया का एक नया उदाहरण के साथ है, और alert तो वापसी मान पर कहा जाता है (जो undefined है):

Foo.prototype.alert = function() { 
    alert(this); 
}(new Foo()).alert(); 

के रूप में @Nemoy ने उल्लेख किया है, यदि आप केवल new Foo().alert() का उपयोग करते हैं तो आपको अपेक्षित व्यवहार मिलेगा क्योंकि स्वचालित अर्ध-कॉलन सम्मिलन आपके लिए सही स्थान पर अर्ध-कॉलन डाल देगा (अर्द्ध-कोलन की कमी का अर्थ नहीं बदलता है कोड)। और new ऑपरेटर की सर्वोच्च प्राथमिकता है, इसलिए कोष्ठक की आवश्यकता नहीं है।

6

आपका कोड वास्तव में है:

function Foo() { 
} 

Foo.prototype.alert = function() { 
    alert(this); 
}(new Foo()).alert(); 
लापता अर्धविराम की वजह से

, अर्धविराम जोड़ सकते हैं और इसे ठीक से चलेंगे।

+0

+1 मुझे इसे मारो। यह ** कई ** कारणों में से एक है जो डरावनी पर निर्भर नहीं है [स्वचालित अर्धविराम सम्मिलन] (http://es5.github.com/#x7.9)। –

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