आपको उसी पंक्ति पर एक अनाम फ़ंक्शन को आमंत्रित करने की आवश्यकता क्यों है?


374

मैं क्लोजर के बारे में कुछ पोस्ट पढ़ रहा था और हर जगह यह देखा, लेकिन यह कैसे काम करता है, इसकी कोई स्पष्ट व्याख्या नहीं है - हर बार मुझे सिर्फ यह बताया गया था कि ...:

// Create a new anonymous function, to use as a wrapper
(function(){
    // The variable that would, normally, be global
    var msg = "Thanks for visiting!";

    // Binding a new function to a global object
    window.onunload = function(){
        // Which uses the 'hidden' variable
        alert( msg );
    };
// Close off the anonymous function and execute it
})();

ठीक है मैं देख रहा हूं कि हम नए अनाम फ़ंक्शन बनाएंगे और फिर इसे निष्पादित करेंगे। तो उसके बाद यह सरल कोड काम करना चाहिए (और यह करता है):

(function (msg){alert(msg)})('SO');

मेरा सवाल यह है कि यहां किस तरह का जादू होता है? मैंने सोचा था कि जब मैंने लिखा था:

(function (msg){alert(msg)})

तब एक नया अनाम फ़ंक्शन फ़ंक्शन "" (msg) की तरह बनाया जाएगा ...

लेकिन फिर यह काम क्यों नहीं करता है?

(function (msg){alert(msg)});
('SO');

इसे एक ही पंक्ति में होने की आवश्यकता क्यों है?

क्या आप मुझे कुछ पोस्ट बता सकते हैं या मुझे स्पष्टीकरण दे सकते हैं?


2
अन्य भाषाओं में इन्हें फंक्शन पॉइंटर्स या डेलीगेट्स कहा जाता है, यदि आप निम्न-स्तरीय संरचनाओं को देखना चाहते हैं।
बजे क्रिस मोसचिनी

17
तुम्हारे पास एक ; पहली पंक्ति में
ओलिवर नी

अब जब आप जानते हैं कि यह कैसे काम करता है ... इसका उपयोग न करें। हमें गुमनाम कार्यों को लिखना बंद कर देना चाहिए । बस कुछ और पात्रों के साथ हम अपने कार्यों को एक वास्तविक नाम दे सकते हैं और जावास्क्रिप्ट कोड को डीबग करना इतना आसान बना सकते हैं!
स्टिजन डे विट

1
लाइन (function (msg){alert(msg)})('SO');पूरी तरह से अपने आप काम करती है। इससे पहले आपके द्वारा पोस्ट किए गए अन्य अनाम फ़ंक्शन से इसका कोई लेना-देना नहीं है। वे दो पूरी तरह से अलग गुमनाम कार्य हैं। आपको तुरंत एक अनाम फ़ंक्शन शुरू करना होगा क्योंकि इसका कोई नाम नहीं है और बाद में संदर्भित नहीं किया जा सकता है।
ऑक्टोपस

जवाबों:


380

फ़ंक्शन परिभाषा के बाद अर्धविराम ड्रॉप करें।

(function (msg){alert(msg)})
('SO');

ऊपर काम करना चाहिए।

डेमो पेज: https://jsfiddle.net/e7ooeq6m/

मैंने इस पोस्ट में इस तरह के पैटर्न पर चर्चा की है:

jQuery और $ प्रश्न

संपादित करें:

यदि आप ECMA स्क्रिप्ट विनिर्देश को देखें , तो 3 तरीके हैं जिनसे आप किसी फ़ंक्शन को परिभाषित कर सकते हैं। (पृष्ठ 98, धारा 13 कार्य परिभाषा)

1. फंक्शन कंस्ट्रक्टर का उपयोग करना

var sum = new Function('a','b', 'return a + b;');
alert(sum(10, 20)); //alerts 30

2. फंक्शन घोषणा का उपयोग करना।

function sum(a, b)
{
    return a + b;
}

alert(sum(10, 10)); //Alerts 20;

3. समारोह अभिव्यक्ति

var sum = function(a, b) { return a + b; }

alert(sum(5, 5)); // alerts 10

तो आप पूछ सकते हैं, घोषणा और अभिव्यक्ति के बीच अंतर क्या है?

ECMA स्क्रिप्ट विनिर्देश से:

समारोह: समारोह पहचानकर्ता (FormalParameterListopt) {FunctionBody}

फंक्शनएक्सप्रेशन: फंक्शन आइडेंटिफ़ॉप्ट (FormalParameterListopt) {FunctionBody}

यदि आप ध्यान दें, तो फ़ंक्शन पहचान के लिए 'पहचानकर्ता' वैकल्पिक है । और जब आप एक पहचानकर्ता नहीं देते हैं, तो आप एक अनाम फ़ंक्शन बनाते हैं। इसका मतलब यह नहीं है कि आप एक पहचानकर्ता निर्दिष्ट नहीं कर सकते।

इसका मतलब यह है कि मान्य है।

var sum = function mySum(a, b) { return a + b; }

ध्यान देने वाली महत्वपूर्ण बात यह है कि आप 'mySum' का उपयोग केवल mySum फ़ंक्शन बॉडी के अंदर कर सकते हैं, बाहर नहीं। निम्न उदाहरण देखें:

var test1 = function test2() { alert(typeof test2); }

alert(typeof(test2)); //alerts 'undefined', surprise! 

test1(); //alerts 'function' because test2 is a function.

लाइव डेमो

इसकी तुलना करें

 function test1() { alert(typeof test1) };

 alert(typeof test1); //alerts 'function'

 test1(); //alerts 'function'

इस ज्ञान के साथ सशस्त्र, चलो अपने कोड का विश्लेषण करने की कोशिश करते हैं।

जब आपके पास कोड हो,

    function(msg) { alert(msg); }

आपने एक फंक्शन एक्सप्रेशन बनाया। और आप इस फ़ंक्शन अभिव्यक्ति को कोष्ठक के अंदर लपेटकर निष्पादित कर सकते हैं।

    (function(msg) { alert(msg); })('SO'); //alerts SO.

1
हाँ, लेकिन क्यों? इनलाइन के रूप में इसकी आवश्यकता क्यों है? कोई फर्क नहीं पड़ता कि मैं कितने सफेद स्थान का उपयोग करूंगा।
पालिग 16:30

9
जैसा कि मैंने लिखा, अर्ध-उपनिवेश ने अनाम फ़ंक्शन की परिभाषा को समाप्त कर दिया। क्योंकि इसका कोई नाम नहीं है (यह अनाम दोहा है!), आप इसे अब कॉल नहीं कर पाएंगे। यदि आप अर्धविराम नहीं लगाते हैं, तब भी कार्य निष्पादित किया जा सकता है।
सोल्यूययोगी

मैंने सोचा था कि स्वचालित अर्धविराम सम्मिलन इस मामले में अर्धविराम लगाएगा, लेकिन ऐसा नहीं है। तो आप सही हैं।
नोसरेडना

1
Nosredna, JS अर्ध-कॉलोनों को जोड़ने की बात करते समय मनमाने ढंग से व्यवहार करती है। इस विस्तृत लेख को पढ़ें: blog.boyet.com/blog/javascriptlessons/…
SolutionYogi

हां मैं देख रहा हूं कि (फ़ंक्शन (संदेश) {अलर्ट (संदेश)}) ('एसओ'); काम करता है। मैं बस पूछ रहा था कि यह काम क्यों करता है। यह कहाँ निर्दिष्ट किया गया है या किस प्रकार की जेएस विशेषता है। इसलिए एक बार मैं फोन करूंगा: (फ़ंक्शन (संदेश) {अलर्ट (संदेश)}) फ़ंक्शन के साथ क्या होगा? यह GC'ed होगा?
पालि

129

इसे एक सेल्फ इनवैलिड फंक्शन कहा जाता है।

जब आप कॉल करते हैं तो आप (function(){})एक फ़ंक्शन ऑब्जेक्ट वापस कर रहे हैं । जब आप ()इसे संलग्न करते हैं, तो इसे लागू किया जाता है और शरीर में कुछ भी निष्पादित किया जाता है। ;बयान के अंत को दर्शाता है, तो इस कारण 2 मंगलाचरण विफल रहता है।


आह ठीक है, मैं देख रहा हूँ, तो यह सिर्फ कुछ विशेष जेएस 'वाक्यविन्यास, सही है? इस स्पष्टीकरण की तरह! सरल और छोटा :)
palig

मुझे लगता है कि यह कहना गलत है कि शरीर 'विकसित' हो जाएगा। यह किसी अन्य फ़ंक्शन की तरह ही निष्पादित होता है। क्योंकि यह अनाम है, या तो आप कहीं संदर्भ को सहेज सकते हैं या इसे तुरंत निष्पादित कर सकते हैं।
समाधानयोगी

16
व्यक्तिगत रूप से, मुझे 'सेल्फ इनवॉइसिंग फंक्शन' शब्द भी पसंद नहीं है। ऐसा नहीं है कि यह फंक्शन अपने आप ही शुरू हो रहा है। प्रोग्रामर ने उन कोष्ठकों को लिखने के लिए लिखा।
समाधानयोगी

यह "विशेष वाक्यविन्यास" नहीं है और कुछ भी विशेष नहीं है। दरअसल, "फ़ंक्शन नाम (args) {BLOCK}" फ़ॉर्म बहुत अधिक "विशेष" है। यह वास्तव में अनावश्यक चीनी है; हालांकि, यह वही है जो वास्तव में चीजों को बनाता है।
जुलवे

2
लेख के लिए अच्छा लिंक। यह नोट करता है कि कोई व्यक्ति इस उद्धरण का उपयोग क्यों करेगा: "वैश्विक ऑब्जेक्ट की सुरक्षा के प्रयास में, सभी जावास्क्रिप्ट अनुप्रयोगों को एक स्व-आहरण फ़ंक्शन के भीतर लिखा जाना चाहिए। यह एक एप्लिकेशन स्कोप बनाएगा जिसमें वेरिएबल को बिना टकराव के डर के बनाया जा सकता है। अन्य अनुप्रयोगों के साथ। " और यह भी नोट किया "एक बार जब फ़ंक्शन समाप्त हो जाता है, तो चर को छोड़ दिया जाता है और वैश्विक ऑब्जेक्ट अपरिवर्तित रहता है।"
यिदिक्सन १३'१३

94

एक बात मुझे भ्रमित करने वाली मिली कि "()" समूह संचालक हैं।

यहां आपका मूल घोषित कार्य है।

पूर्व। 1:

var message = 'SO';

function foo(msg) {
    alert(msg);
}

foo(message);

फ़ंक्शंस ऑब्जेक्ट हैं, और उन्हें समूहीकृत किया जा सकता है। तो चलिए फंक्शन के चारों ओर परेंस को फेंकते हैं।

पूर्व। 2:

var message = 'SO';

function foo(msg) {  //declares foo
    alert(msg);
}

(foo)(message);     // calls foo

अब एक ही फ़ंक्शन को कॉल करने और राइट-ऑफ़ घोषित करने के बजाय, हम इसे घोषित करने के लिए मूल प्रतिस्थापन का उपयोग कर सकते हैं।

पूर्व। 3।

var message = 'SO';

(function foo(msg) {
    alert(msg);
})(message);          // declares & calls foo

अंत में, हमें उस अतिरिक्त फू की आवश्यकता नहीं है क्योंकि हम इसे कॉल करने के लिए नाम का उपयोग नहीं कर रहे हैं! कार्य अनाम हो सकते हैं।

पूर्व। 4।

var message = 'SO';

(function (msg) {   // remove unnecessary reference to foo
    alert(msg);
})(message);

अपने प्रश्न का उत्तर देने के लिए, उदाहरण 2 पर वापस जाएँ। आपकी पहली पंक्ति कुछ नामहीन फ़ंक्शन और समूहों को घोषित करती है, लेकिन इसे कॉल नहीं करती है। दूसरी पंक्ति समूह एक स्ट्रिंग। दोनों कुछ नहीं करते। (विंसेंट का पहला उदाहरण।)

(function (msg){alert(msg)});  
('SO');                       // nothing.

(foo); 
(msg); //Still nothing.

परंतु

(foo)
(msg); //works

6
धन्यवाद। आपके उदाहरण बिल्कुल स्पष्ट थे। मैं इस बात से अनजान था कि जावास्क्रिप्ट में कोष्ठक इस तरह से कोड का अर्थ बदल सकता है। मैं जावा बैकग्राउंड से आता हूं, इसलिए मैं लगभग हर दिन जावास्क्रिप्ट के बारे में कुछ नया (और अक्सर अनपेक्षित) सीखता हूं।
hotshot309

5
यह कदम से कदम करने के लिए धन्यवाद, यह मैंने देखा है किसी भी अन्य स्पष्टीकरण की तुलना में बेहतर है। +1
Wk_of_Angmar

2
मेजर AHA पल यहाँ- और प्रतिस्थापन के साथ चित्रण के लिए धन्यवाद। +100
फ्रेड वेवग्यू

1
अनाम कार्यों के बारे में मैंने सबसे अच्छे स्पष्टीकरणों में से एक पढ़ा है। आपका बहुत बहुत धन्यवाद!
तेकोनोटिका

23

एक अनाम फ़ंक्शन "" नाम के साथ एक फ़ंक्शन नहीं है। यह बिना नाम के बस एक फंक्शन है।

जावास्क्रिप्ट में किसी भी अन्य मूल्य की तरह, एक फ़ंक्शन को एक नाम बनाने की आवश्यकता नहीं है। हालांकि यह वास्तव में किसी भी अन्य मूल्य की तरह ही इसे एक नाम से बाँधने के लिए अधिक उपयोगी है।

लेकिन किसी भी अन्य मूल्य की तरह, आप कभी-कभी इसे एक नाम के लिए बाध्य किए बिना उपयोग करना चाहते हैं। यह सेल्फ-इनवोकिंग पैटर्न है।

यहां एक फ़ंक्शन और एक संख्या है, बाध्य नहीं है, वे कुछ भी नहीं करते हैं और कभी भी उपयोग नहीं किए जा सकते हैं:

function(){ alert("plop"); }
2;

इसलिए हमें उन्हें किसी अन्य मूल्य की तरह उपयोग करने में सक्षम होने के लिए एक चर में संग्रहीत करना होगा:

var f = function(){ alert("plop"); }
var n = 2;

फ़ंक्शन को चर में बाँधने के लिए आप सिंटैटिक शुगर का भी उपयोग कर सकते हैं:

function f(){ alert("plop"); }
var n = 2;

लेकिन अगर उनका नामकरण आवश्यक नहीं है और अधिक भ्रम और कम पठनीयता पैदा करेगा, तो आप उन्हें तुरंत उपयोग कर सकते हैं।

(function(){ alert("plop"); })(); // will display "plop"
alert(2 + 3); // will display 5

यहां, मेरा फ़ंक्शन और मेरी संख्याएं एक चर के लिए बाध्य नहीं हैं, लेकिन फिर भी उनका उपयोग किया जा सकता है।

इस तरह कहा गया है, यह ऐसा लगता है कि आत्म-आहरण समारोह का कोई वास्तविक मूल्य नहीं है। लेकिन आपको यह ध्यान रखना होगा कि जावास्क्रिप्ट गुंजाइश सीमांकक फ़ंक्शन है और ब्लॉक ({}) नहीं है।

तो एक स्व-आहरण फ़ंक्शन का वास्तव में C ++, C # या जावा ब्लॉक के समान अर्थ है। जिसका अर्थ है कि अंदर बनाया गया चर दायरे से बाहर "लीक" नहीं होगा। वैश्विक दायरे को प्रदूषित न करने के लिए यह जावास्क्रिप्ट में बहुत उपयोगी है।


अच्छा लेख। फिर 'फ़ंक्शन () {अलर्ट ("प्लॉप") के साथ क्या होगा; } 'जब मैंने इसे निष्पादित किया था? यह GC'ed होगा?
पालि

2
फ़ंक्शन () {अलर्ट ("प्लॉप"); } निर्देश केवल फ़ंक्शन को आवंटित करता है लेकिन इसे निष्पादित नहीं करता है और न ही इसे किसी चर में बांधता है। चूंकि निर्मित फ़ंक्शन किसी भी चर के लिए बाध्य नहीं है, इसलिए इसे जल्दी से जीसीड किया जाएगा।
विंसेंट रॉबर्ट

यह SO थ्रेड उस दायरे से परे है, जिसके बारे में हम यहां बात कर रहे हैं, लेकिन यह जावास्क्रिप्ट नेमस्पेस को अलग करने के तरीके बताता है - और इसमें ऐसे उदाहरण भी शामिल हैं जो सेल्फ-इनवॉइसिंग फंक्शन्स का उपयोग करते हैं।
hotshot309

19

यह सिर्फ जावास्क्रिप्ट कैसे काम करता है आप एक नामित समारोह की घोषणा कर सकते हैं:

function foo(msg){
   alert(msg);
}

और इसे कॉल करें:

foo("Hi!");

या, आप एक अनाम फ़ंक्शन घोषित कर सकते हैं:

var foo = function (msg) {
    alert(msg);
}

और कॉल करें कि:

foo("Hi!");

या, आप फ़ंक्शन को कभी भी नाम से बाँध नहीं सकते:

(function(msg){
   alert(msg);
 })("Hi!");

फ़ंक्शंस भी वापस कर सकते हैं:

function make_foo() {
    return function(msg){ alert(msg) };
}

(make_foo())("Hi!");

यह कुछ भी नहीं है कि किसी भी चर को "var" के साथ परिभाषित किया make_fooजाएगा जिसे प्रत्येक फ़ंक्शन द्वारा वापस लौटा दिया जाएगा make_foo। यह एक बंद है, और इसका मतलब है कि एक फ़ंक्शन द्वारा मूल्य में किए गए किसी भी परिवर्तन को दूसरे द्वारा दिखाई देगा।

यदि आप चाहें, तो यह आपको जानकारी संलग्न कर सकता है:

function make_greeter(msg){
    return function() { alert(msg) };
}

var hello = make_greeter("Hello!");

hello();

यह लगभग हर प्रोग्रामिंग भाषा है, लेकिन जावा काम करता है।


8

आपके द्वारा दिखाया गया कोड,

(function (msg){alert(msg)});
('SO');

दो से मिलकर बयानों से । पहला एक अभिव्यक्ति है जो एक फ़ंक्शन ऑब्जेक्ट (जो तब कचरा एकत्र किया जाएगा क्योंकि यह सहेजा नहीं जाता है) प्राप्त करता है। दूसरा एक अभिव्यक्ति है जो एक स्ट्रिंग पैदा करता है। फ़ंक्शन को स्ट्रिंग पर लागू करने के लिए, आपको या तो स्ट्रिंग को फ़ंक्शन के लिए एक तर्क के रूप में पास करना होगा जब यह बनाया जाता है (जो आप ऊपर भी दिखाते हैं), या आपको फ़ंक्शन को वास्तव में एक चर में संग्रहीत करने की आवश्यकता होगी, ताकि आप कर सकें इसे बाद में अपने अवकाश पर लागू करें। इस तरह:

var f = (function (msg){alert(msg)});
f('SO');

ध्यान दें कि एक अनाम फ़ंक्शन (एक लंबो फ़ंक्शन) को एक चर में संग्रहीत करके, आपके प्रभावी रूप से इसे एक नाम दे रहे हैं। इसलिए आप बस एक नियमित कार्य को परिभाषित कर सकते हैं:

function f(msg) {alert(msg)};
f('SO');

7

पिछली टिप्पणियों के सारांश में:

function() {
  alert("hello");
}();

जब एक चर को सौंपा नहीं जाता है, तो एक सिंटैक्स त्रुटि उत्पन्न होती है। कोड को एक फ़ंक्शन स्टेटमेंट (या परिभाषा) के रूप में रखा गया है, जो समापन कोष्ठकों को वाक्यविन्यास रूप से गलत बताती है। फ़ंक्शन भाग के चारों ओर कोष्ठक जोड़ना दुभाषिया (और प्रोग्रामर) को बताता है कि यह एक फ़ंक्शन एक्सप्रेशन (या इनवोकेशन) है, जैसे कि

(function() {
  alert("hello");
})();

यह एक स्व-आहरण समारोह है, जिसका अर्थ यह गुमनाम रूप से बनाया गया है और तुरंत चलता है क्योंकि आह्वान उसी पंक्ति में होता है जहां यह घोषित किया जाता है। इस सेल्फ-इनवोकिंग फ़ंक्शन को परिचित तर्क के साथ नो-तर्क फ़ंक्शन को कॉल करने के लिए संकेत दिया गया है, साथ ही फ़ंक्शन के नाम के साथ कोष्ठक जोड़े गए हैं:(myFunction)(); :।

नहीं है एक अच्छा अतः चर्चा JavaScript फ़ंक्शन वाक्य रचना


3

यह उत्तर सख्ती से प्रश्न से संबंधित नहीं है, लेकिन आपको यह पता लगाने में रुचि हो सकती है कि इस प्रकार की वाक्य रचना सुविधा विशेष रूप से फ़ंक्शन के लिए नहीं है। उदाहरण के लिए, हम हमेशा कुछ ऐसा कर सकते हैं:

alert(
    {foo: "I am foo", bar: "I am bar"}.foo
); // alerts "I am foo"

कार्यों से संबंधित। जैसा कि वे ऑब्जेक्ट्स हैं, जो फंक्शन.प्रोटोटाइप से विरासत में मिलते हैं, हम इस तरह की चीजें कर सकते हैं:

Function.prototype.foo = function () {
    return function () {
        alert("foo");
    };
};

var bar = (function () {}).foo();

bar(); // alerts foo

और आप जानते हैं, हमें उन्हें निष्पादित करने के लिए कोष्ठक के साथ कार्यों को घेरना भी नहीं चाहिए। वैसे भी, जब तक हम परिणाम को एक चर में निर्दिष्ट करने का प्रयास करते हैं।

var x = function () {} (); // this function is executed but does nothing

function () {} (); // syntax error

एक अन्य चीज़ जो आप फ़ंक्शंस के साथ कर सकते हैं, जैसे ही आप उन्हें घोषित करते हैं, newउनके ऊपर ऑपरेटर को आमंत्रित करना और एक ऑब्जेक्ट प्राप्त करना है। निम्नलिखित समतुल्य हैं:

var obj = new function () {
    this.foo = "bar";
};

var obj = {
    foo : "bar"
};

3

जावास्क्रिप्ट समारोह में एक और संपत्ति है। यदि आप एक ही अनाम फ़ंक्शन को पुनरावर्ती रूप से कॉल करना चाहते हैं।

(function forInternalOnly(){

  //you can use forInternalOnly to call this anonymous function
  /// forInternalOnly can be used inside function only, like
  var result = forInternalOnly();
})();

//this will not work
forInternalOnly();// no such a method exist

2
+1 ने एक छोटा सा नमूना जोड़ा, ताकि यह स्पष्ट हो जाए :-) पहली बार जब मैंने इसे पढ़ा तो मुझे 4 बार फिर से पढ़ना पड़ा।
xanatos

3

प्रश्नकर्ता के प्रश्न के बारे में मेरी समझ ऐसी है:

यह जादू कैसे काम करता है:

(function(){}) ('input')   // Used in his example

शायद मैं गलत हो सकता हूँ। हालाँकि, सामान्य प्रथा जो लोगों से परिचित है:

(function(){}('input') )

इसका कारण यह है कि जावास्क्रिप्ट कोष्ठक AKA (), कथन शामिल नहीं कर सकता है और जब पार्सर फ़ंक्शन कीवर्ड का सामना करता है, तो इसे फ़ंक्शन अभिव्यक्ति के रूप में पार्स करना जानता है न कि फ़ंक्शन की घोषणा।

स्रोत: ब्लॉग पोस्ट तुरंत-आमंत्रित फ़ंक्शन अभिव्यक्ति (IIFE)


3

कोष्ठक के बिना उदाहरण:

void function (msg) { alert(msg); }
('SO');

(यह शून्य का वास्तविक उपयोग है, afaik)

या

var a = function (msg) { alert(msg); }
('SO');

या

!function (msg) { alert(msg); }
('SO');

साथ ही काम करें। voidअसाइनमेंट और धमाके के रूप में अभिव्यक्ति का मूल्यांकन करने के खड़ी कर रहा है, साथ ही। पिछले एक के साथ काम करता ~, +, -, delete, typeof, एकल ऑपरेटरों में से कुछ ( voidऔर साथ ही एक है)। काम नहीं कर रहा couse के हैं ++, --क्योंकि एक चर की आवश्यकता की।

लाइन ब्रेक आवश्यक नहीं है।


@Bergi पर ie11 deleteकाम करता है। साथ भी 'use strict';। यह भी काम करता है:delete (3 + 4);
नीना स्कोलज़

उफ़, मेरी गलती है। " 2) यदि टाइप (रेफ) संदर्भ नहीं है, तो वापस लौटें। " यह केवल वास्तविक संदर्भों के लिए त्रुटियां फेंकता है जो अनार्य हैं।
बरगी

1

यह एक स्व-निष्पादित अनाम फ़ंक्शन है। ब्रैकेट के पहले सेट में निष्पादित किए जाने वाले भाव होते हैं, और ब्रैकेट का दूसरा सेट उन अभिव्यक्तियों को निष्पादित करता है।

(function () {
    return ( 10 + 20 );
})();

पीटर मिचौक्स एक महत्वपूर्ण पेयर ऑफ़ पेरेंटेस के अंतर पर चर्चा करते हैं

पैरेंट नेमस्पेस से वैरिएबल को छिपाने की कोशिश करते समय यह एक उपयोगी निर्माण है। फ़ंक्शन के भीतर सभी कोड फ़ंक्शन के निजी दायरे में निहित हैं, जिसका अर्थ है कि इसे फ़ंक्शन के बाहर से बिल्कुल भी एक्सेस नहीं किया जा सकता है, जिससे यह वास्तव में निजी हो जाता है।

देख:

  1. बंद (कंप्यूटर विज्ञान)
  2. जावास्क्रिप्ट नामकरण
  3. जावास्क्रिप्ट कोष्ठकों की महत्वपूर्ण जोड़ी

0

एक और दृष्टिकोण

सबसे पहले, आप एक अनाम फ़ंक्शन घोषित कर सकते हैं:

var foo = function(msg){
 alert(msg);
}

तब आप इसे कहते हैं:

foo ('Few');

क्योंकि foo = function (msg) {अलर्ट (msg);} ताकि आप foo को इस प्रकार बदल सकें :

function(msg){
 alert(msg);
} ('Few');

लेकिन आपको अपने संपूर्ण अनाम फ़ंक्शन को पेयरिंग के दौरान फ़ंक्शन की सिंटैक्स त्रुटि से बचने के लिए ब्रेसेस की जोड़ी के अंदर लपेटना चाहिए। तो हमारे पास हैं,

(function(msg){
 alert(msg);
}) ('Few');

इस तरह, यह मेरे लिए आसान है।


0

जब आपने किया:

(function (msg){alert(msg)});
('SO');

('SO')अर्धविराम के कारण आपने कार्य समाप्त कर दिया । यदि आप लिखते हैं:

(function (msg){alert(msg)})
('SO');

यह काम करेगा।

काम करने का उदाहरण: http://jsfiddle.net/oliverni/dbVjg/


0

साधारण कार्य क्यों नहीं करता है इसका सरल कारण ;अनाम फ़ंक्शन के अंत का संकेत है। ऐसा इसलिए है क्योंकि ()फ़ंक्शन कॉल के अंत के बिना , यह फ़ंक्शन कॉल नहीं है। अर्थात्,

function help() {return true;}

यदि आप कहते हैं कि result = help();यह एक फ़ंक्शन के लिए एक कॉल है और सच लौटेगा।

अगर तुम बुलाओ result = help; यह नहीं है। यह एक असाइनमेंट है जहाँ मदद के लिए परिणाम के लिए सौंपे जाने वाले डेटा की तरह व्यवहार किया जाता है।

आपने जो कुछ किया, वह अर्धविराम जोड़कर एक अनाम फ़ंक्शन घोषित / त्वरित कर रहा था,

(function (msg) { /* Code here */ });

और फिर इसे केवल कोष्ठकों का उपयोग करके किसी अन्य कथन में कॉल करने का प्रयास किया ... जाहिर है क्योंकि फ़ंक्शन का कोई नाम नहीं है, लेकिन यह काम नहीं करेगा:

('SO');

दुभाषिया दूसरी पंक्ति में नए निर्देश / कथन के रूप में कोष्ठक को देखता है, और इस तरह यह काम नहीं करता है, भले ही आपने इसे इस तरह से किया हो:

(function (msg){/*code here*/});('SO');

यह अभी भी काम नहीं करता है, लेकिन यह तब काम करता है जब आप अर्धविराम को हटाते हैं क्योंकि दुभाषिया सफेद स्थान और कैरेज़ को अनदेखा करता है और पूर्ण कोड को एक बयान के रूप में देखता है।

(function (msg){/*code here*/})        // This space is ignored by the interpreter
('SO');

निष्कर्ष: एक फ़ंक्शन कॉल ()अंत तक बिना किसी फ़ंक्शन कॉल के नहीं है जब तक कि किसी अन्य फ़ंक्शन द्वारा निर्दिष्ट शर्तों के तहत, जैसे कि, onload = 'help' मदद फ़ंक्शन को निष्पादित करेगा भले ही कोष्ठक शामिल नहीं थे। मेरा मानना ​​है कि सेटटाइमआउट और सेट इन्टरवल इस प्रकार के फ़ंक्शन कॉल को भी अनुमति देते हैं, और मेरा यह भी मानना ​​है कि दुभाषिया किसी भी तरह से पर्दे के पीछे कोष्ठक जोड़ता है जो हमें "फ़ंक्शन कॉल को कोष्ठकों के बिना फ़ंक्शन कॉल नहीं है" वापस लाता है।


मुझे समझ में नहीं आता कि इसने इतने सारे डाउनवोट क्यों प्राप्त किए। मुझे लगता है कि यह एक स्वीकार्य जवाब है? : /
डैनियल चेउंग

0
(function (msg){alert(msg)})
('SO');

यह एक अनाम कार्य को बंद करने के रूप में उपयोग करने का एक सामान्य तरीका है जिसे कई जावास्क्रिप्ट फ्रेमवर्क उपयोग करते हैं।

कोड कहा जाता है जब यह फ़ंक्शन स्वचालित रूप से कहा जाता है।

यदि ;पहली पंक्ति में रखते हुए, संकलक ने इसे दो अलग-अलग रेखाओं के रूप में माना। तो आपको ऊपर जैसा परिणाम नहीं मिल सकता है।

यह भी लिखा जा सकता है:

(function (msg){alert(msg)}('SO'));

अधिक जानकारी के लिए, जावास्क्रिप्ट / बेनामी कार्यों में देखें


जहां तक ​​मुझे पता है, जावास्क्रिप्ट "संकलन" नहीं करता है
डैनियल चेउंग

0
  1. बेनामी फ़ंक्शन ऐसे फ़ंक्शंस हैं जो गतिशील रूप से रनटाइम पर घोषित किए जाते हैं। उन्हें अनाम फ़ंक्शंस कहा जाता है क्योंकि उन्हें सामान्य फ़ंक्शंस के समान नाम नहीं दिया जाता है।

    फ़ंक्शन की घोषणा के बजाय फ़ंक्शन ऑपरेटर का उपयोग करके बेनामी फ़ंक्शन घोषित किए जाते हैं। आप एक नया फ़ंक्शन बनाने के लिए फ़ंक्शन ऑपरेटर का उपयोग कर सकते हैं जहाँ यह एक अभिव्यक्ति लगाने के लिए वैध है। उदाहरण के लिए, आप एक फंक्शन कॉल के लिए एक पैरामीटर के रूप में एक नया फ़ंक्शन घोषित कर सकते हैं या किसी अन्य ऑब्जेक्ट की संपत्ति असाइन कर सकते हैं।

    नामांकित फ़ंक्शन का एक विशिष्ट उदाहरण यहां दिया गया है:

    समारोह flyToTheMoon () {चेतावनी ("ज़ूम! ज़ूम! ज़ूम!")। } चाँद तक उड़ो(); यहां अनाम फ़ंक्शन के रूप में एक ही उदाहरण बनाया गया है:

    var flyToTheMoon = function () {अलर्ट ("ज़ूम! ज़ूम! ज़ूम!"); } चाँद तक उड़ो();

    जानकारी के लिए कृपया यहाँ पढ़ें:

    http://helephant.com/2008/08/23/javascript-anonymous-functions/


0

IIFE बस फ़ंक्शन को कंपाइल करता है और msgवैरिएबल को छुपाता है ताकि ग्लोबल नेमस्पेस "प्रदूषित" न हो। वास्तव में, बस इसे सरल रखें और नीचे पसंद करें जब तक कि आप एक बिलियन डॉलर की वेबसाइट नहीं बना रहे हैं।

var msg = "later dude";
window.onunload = function(msg){
  alert( msg );
};

आप msgएक खुलासा मॉड्यूल पैटर्न का उपयोग करके अपनी संपत्ति के नाम बता सकते हैं :

var myScript = (function() {
    var pub = {};
    //myscript.msg
    pub.msg = "later dude";
    window.onunload = function(msg) {
        alert(msg);
    };
    //API
    return pub;
}());

-1

बेनामी फ़ंक्शंस एक-शॉट डील के लिए होते हैं, जहाँ आप फ़्लाइ पर एक फंक्शन को परिभाषित करते हैं ताकि यह आपके द्वारा दिए गए इनपुट से आउटपुट उत्पन्न करे। सिवाय इसके कि आपने इनपुट नहीं दिया। इसके बजाय, आपने दूसरी पंक्ति ('एसओ') पर कुछ लिखा; - एक स्वतंत्र बयान जिसका समारोह से कोई लेना-देना नहीं है। आपने क्या उम्मीद किया? :)


100% सही नहीं है। यह अच्छी तरह से एक गुमनाम समारोह है और पुन: उपयोग करने के लिए है: var foo = function() {};। हालांकि बाकी सब ठीक है।
फेलिक्स क्लिंग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.