2010-08-16 16 views
6

क्या दो परिभाषाओं और कार्यों के असाइनमेंट में कोई अंतर है?इस तरह क्यों "this.foo = new (function() {..})();" बनाम "this.foo = function() {...};"

this.foo = new (function() {..})(); 

बनाम

this.foo = function(){...}; 
+0

भी देखें: http://stackoverflow.com/questions/2274695/new-function-with-lower-case-f-in-javascript और http://stackoverflow.com/questions/1895635/javascript -सिंगलेटन-प्रश्न – CMS

उत्तर

8

पहले उदाहरण में, यह एक समारोह को बनाने और उसे क्रियान्वित करने, this.foo के परिणाम निर्धारित कर रहा है। दूसरे उदाहरण में, यह फ़ंक्शन बना रहा है और फ़ंक्शन को इस पर असाइन कर रहा है। Foo।

+0

यह उदाहरण दूसरे उदाहरण में है, फ़ंक्शन पॉइंटर के बराबर सही है? –

+0

@ केनीसीसन: आप इसे इस तरह देख सकते हैं। यह वर्तमान संदर्भ में चर 'foo' को फ़ंक्शन असाइन कर रहा है। हालांकि, 'फ़ंक्शन foo() {....} लिखना * बिल्कुल वही काम करेगा। –

+2

@james बिल्कुल बिल्कुल नहीं, 'फ़ंक्शन foo()' इसे दायरे के शीर्ष पर इंगित करेगा, 'this.foo = function()' इसे सही तरीके से असाइन करता है – Rixius

-2

आपका पहला उदाहरण सादा गलत है, क्या आपने वास्तव में इसे आजमाया है? आप new उपयोग करना चाहते हैं और Function निर्माता इसे इस तरह काम करता है:

foo = new Function("function body"); 

उदाहरण 2 (यह एक समारोह को परिभाषित करने का सबसे बुरा संभव तरीका है) जाने का रास्ता है। एक समारोह एक नई अभिव्यक्ति के हिस्से के रूप में कहा जाता है, यह है:

+0

पहले उदाहरण में अनाम फ़ंक्शन एक फ़ंक्शन लौटा सकता है, जो कि फिर 'नए' ऑपरेटर के साथ प्रयोग किया जाता है। शायद अज्ञात फ़ंक्शन किसी प्रकार का ऑब्जेक्ट फ़ैक्टरी है? –

+0

असल में @ रयान यह तब तक नहीं करेगा जब तक कि आप उस अभिव्यक्ति के दाहिने तरफ लपेटें (यानी, संपूर्ण फ़ंक्शन कॉल) माता-पिता की एक और परत में। "नया" ऑपरेटर कम से कम() के रूप में कसकर बांधता है, इसलिए यह '(नया (फ़ंक्शन() {...}))()' जैसा कि वर्तमान में लिखा गया है। – Pointy

+0

'नया फ़ंक्शन() {...} 'ठीक है। यह वही काम नहीं करता है जैसे 'नया फ़ंक्शन() '। यह वही काम करता है जो 'नया MyConstructor() 'है, जो पूरी तरह से मान्य है। –

3

मुख्य अंतर के साथ एक 'नई' और एक चर

ECMA 262 15.3.2 के लिए अनाम समारोह बताए समारोह बुला रहा है निर्माता: यह नव निर्मित वस्तु शुरू करता है।

तो this.foo = new (function() {..})(); एक नई वस्तु बनाता है और this.foo

और

this.foo = function(){...}; एक गुमनाम समारोह को परिभाषित करता है करने के लिए इसे प्रदान करती है और यह भी एक और तरीका this.foo = (function() {..})(); है यह प्रदान करती है

this.foo करने के लिए (बिना "नया ") फ़ंक्शन को कॉल करेगा और this.foo

आपके मामले में यदि आप चेतावनी देते हैं:

var foo = new (function() {})(); 
var bar = function() {}; 
var baz = (function() {return "boo";})(); // without the "new" 

alert(foo); // will alert [object Object], the newly created object 
alert(bar); // will alert function) {}, the function itself 
alert(baz); // will alert "boo", the functions return value 
संबंधित मुद्दे