क्या दो परिभाषाओं और कार्यों के असाइनमेंट में कोई अंतर है?इस तरह क्यों "this.foo = new (function() {..})();" बनाम "this.foo = function() {...};"
this.foo = new (function() {..})();
बनाम
this.foo = function(){...};
क्या दो परिभाषाओं और कार्यों के असाइनमेंट में कोई अंतर है?इस तरह क्यों "this.foo = new (function() {..})();" बनाम "this.foo = function() {...};"
this.foo = new (function() {..})();
बनाम
this.foo = function(){...};
पहले उदाहरण में, यह एक समारोह को बनाने और उसे क्रियान्वित करने, this.foo के परिणाम निर्धारित कर रहा है। दूसरे उदाहरण में, यह फ़ंक्शन बना रहा है और फ़ंक्शन को इस पर असाइन कर रहा है। Foo।
यह उदाहरण दूसरे उदाहरण में है, फ़ंक्शन पॉइंटर के बराबर सही है? –
@ केनीसीसन: आप इसे इस तरह देख सकते हैं। यह वर्तमान संदर्भ में चर 'foo' को फ़ंक्शन असाइन कर रहा है। हालांकि, 'फ़ंक्शन foo() {....} लिखना * बिल्कुल वही काम करेगा। –
@james बिल्कुल बिल्कुल नहीं, 'फ़ंक्शन foo()' इसे दायरे के शीर्ष पर इंगित करेगा, 'this.foo = function()' इसे सही तरीके से असाइन करता है – Rixius
आपका पहला उदाहरण सादा गलत है, क्या आपने वास्तव में इसे आजमाया है? आप new
उपयोग करना चाहते हैं और Function
निर्माता इसे इस तरह काम करता है:
foo = new Function("function body");
उदाहरण 2 (यह एक समारोह को परिभाषित करने का सबसे बुरा संभव तरीका है) जाने का रास्ता है। एक समारोह एक नई अभिव्यक्ति के हिस्से के रूप में कहा जाता है, यह है:
पहले उदाहरण में अनाम फ़ंक्शन एक फ़ंक्शन लौटा सकता है, जो कि फिर 'नए' ऑपरेटर के साथ प्रयोग किया जाता है। शायद अज्ञात फ़ंक्शन किसी प्रकार का ऑब्जेक्ट फ़ैक्टरी है? –
असल में @ रयान यह तब तक नहीं करेगा जब तक कि आप उस अभिव्यक्ति के दाहिने तरफ लपेटें (यानी, संपूर्ण फ़ंक्शन कॉल) माता-पिता की एक और परत में। "नया" ऑपरेटर कम से कम() के रूप में कसकर बांधता है, इसलिए यह '(नया (फ़ंक्शन() {...}))()' जैसा कि वर्तमान में लिखा गया है। – Pointy
'नया फ़ंक्शन() {...} 'ठीक है। यह वही काम नहीं करता है जैसे 'नया फ़ंक्शन() '। यह वही काम करता है जो 'नया MyConstructor() 'है, जो पूरी तरह से मान्य है। –
मुख्य अंतर के साथ एक 'नई' और एक चर
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
भी देखें: http://stackoverflow.com/questions/2274695/new-function-with-lower-case-f-in-javascript और http://stackoverflow.com/questions/1895635/javascript -सिंगलेटन-प्रश्न – CMS