javascript - किसी ऑब्जेक्ट / फ़ंक्शन / क्लास घोषणा के आस-पास कोष्ठक का अर्थ क्या है?





syntax (7)


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

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

देख:

http://en.wikipedia.org/wiki/Closure_%28computer_science%29

http://peter.michaux.ca/articles/javascript-namespacing

इस प्रश्न का उत्तर यहां दिया गया है:

मैं जावास्क्रिप्ट और YUI दोनों के लिए नया हूँ। वाईयूआई लाइब्रेरी उदाहरणों में, आप इस निर्माण के कई उपयोग पा सकते हैं:

(function() {
    var Dom = YAHOO.util.Dom,
    Event = YAHOO.util.Event,
    layout = null,
        ...
})();

मुझे लगता है कि अंतिम जोड़े कोष्ठक घोषणा के ठीक बाद समारोह को निष्पादित करना है।

... लेकिन समारोह घोषणा के आस-पास के पिछले सेट के बारे में क्या है?

मुझे लगता है कि यह गुंजाइश का मामला है; यह बाहरी कार्यों और संभावित रूप से वैश्विक वस्तुओं के अंदर चर के अंदर छिपाने के लिए है। क्या यह? अधिक आम तौर पर, उन कोष्ठक के यांत्रिकी क्या हैं?




एंडी ह्यूम gave काफी जवाब gave , मैं बस कुछ और विवरण जोड़ना चाहता हूं।

इस निर्माण के साथ आप अपने मूल्यांकन वातावरण या बंद होने के साथ एक अनाम कार्य बना रहे हैं, और फिर आप इसका तुरंत मूल्यांकन करते हैं। इसके बारे में अच्छी बात यह है कि आप अज्ञात फ़ंक्शन से पहले घोषित चरों तक पहुंच सकते हैं, और आप किसी मौजूदा चर को गलती से ओवरराइट किए बिना इस फ़ंक्शन के अंदर स्थानीय चर का उपयोग कर सकते हैं।

Var कीवर्ड का उपयोग बहुत महत्वपूर्ण है, क्योंकि जावास्क्रिप्ट में प्रत्येक चर डिफ़ॉल्ट रूप से वैश्विक है, लेकिन कीवर्ड के साथ आप एक नया, लेक्सिकली स्कॉप्ड वैरिएबल बनाते हैं, यानी, यह दो ब्रेसिज़ के बीच कोड द्वारा दिखाई देता है। आपके उदाहरण में, आप अनिवार्य रूप से वाईयूआई पुस्तकालय में वस्तुओं के लिए लघु उपनाम बना रहे हैं, लेकिन इसमें अधिक शक्तिशाली उपयोग हैं।

मैं आपको कोड उदाहरण के बिना नहीं छोड़ना चाहता, इसलिए मैं बंद करने के लिए यहां एक साधारण उदाहरण डालूंगा:

var add_gen = function(n) {
  return function(x) {
    return n + x;
  };
};
var add2 = add_gen(2);
add2(3); // result is 5

यहाँ क्या हो रहा है? फ़ंक्शन add_gen में आप एक और फ़ंक्शन बना रहे हैं जो इसके तर्क में संख्या n जोड़ देगा। चाल यह है कि फ़ंक्शन पैरामीटर सूची में परिभाषित चर में, var के साथ परिभाषित की तरह, अक्षय रूप से स्कॉप्ड चर के रूप में कार्य करता है।

लौटाए गए फ़ंक्शन को add_gen फ़ंक्शन के ब्रेसिज़ के बीच परिभाषित किया गया है , इसलिए add_gen फ़ंक्शन निष्पादित करने के बाद भी उसके पास एन के मान तक पहुंच होगी, यही कारण है कि उदाहरण के आखिरी पंक्ति को निष्पादित करते समय आपको 5 मिलेगा।

फ़ंक्शन पैरामीटर की व्याख्यात्मक रूप से स्कॉप्ड की सहायता से, आप गुमनाम कार्यों में लूप चर का उपयोग करने से उत्पन्न "समस्याओं" के आसपास काम कर सकते हैं। एक साधारण उदाहरण लें:

for(var i=0; i<5; i++) {
  setTimeout(function(){alert(i)}, 10);
}

"अपेक्षित" परिणाम संख्या शून्य से चार हो सकता है, लेकिन आपको इसके बजाय मछलियों के चार उदाहरण मिलते हैं। ऐसा इसलिए होता है क्योंकि सेटटाइमआउट और लूप के लिए अज्ञात फ़ंक्शन एक ही वैरिएबल का उपयोग कर रहे हैं, इसलिए जब तक फ़ंक्शंस का मूल्यांकन किया जाता है, तो मैं 5 वर्ष का होगा।

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

for(var i=0; i<5; i++) {
  setTimeout(
     (function(j) {
       return function(){alert(j)};
     })(i), 10);
}

बाहरी कार्य के तत्काल मूल्यांकन के साथ आप प्रत्येक पुनरावृत्ति में नामित एक पूरी तरह से स्वतंत्र चर बना रहे हैं, और मेरे वर्तमान मूल्य को इस चर में कॉपी किया जाएगा, इसलिए आपको परिणाम प्राप्त होगा जो पहले प्रयास से नैतिक रूप से अपेक्षित था।

मेरा सुझाव है कि आप बंद करने को बेहतर समझने के लिए http://ejohn.org/apps/learn/ पर उत्कृष्ट ट्यूटोरियल को समझने का प्रयास करें, जहां मैंने बहुत सी सीखा।




विषय पर कुछ विचार:

  • कोष्ठक:

    ब्राउज़र (इंजन / पार्सर) कीवर्ड फ़ंक्शन को संबद्ध करता है

    [optional name]([optional parameters]){...code...}
    

    तो फ़ंक्शन () {} () जैसे अभिव्यक्ति में अंतिम संश्लेषण का कोई मतलब नहीं है।

    अब सोचो

    name=function(){} ; name() !?
    

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

  • उपयोगिता: ?

    1. लोड पर कुछ कोड निष्पादित करने के लिए और शेष पृष्ठ से उपयोग किए गए चर को अलग करने के लिए विशेष रूप से जब नाम विवाद संभव हो;

    2. Eval ("स्ट्रिंग") के साथ बदलें

      (नया फ़ंक्शन ("स्ट्रिंग")) ()

    3. " = ?: " ऑपरेटर के लिए लंबे कोड लपेटें जैसे:

      परिणाम = exp_to_test? (फ़ंक्शन () {... long_code ...}) (): (फ़ंक्शन () {...}) ();




... लेकिन सभी समारोह घोषणाओं के आस-पास के पिछले दौर के माता-पिता के बारे में क्या?

विशेष रूप से, यह जावास्क्रिप्ट को 'फ़ंक्शन () {...}' को एक इनलाइन अनाम फ़ंक्शन अभिव्यक्ति के रूप में बनाने की व्याख्या करता है। यदि आप ब्रैकेट को छोड़ देते हैं:

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

आपको एक वाक्यविन्यास त्रुटि मिल जाएगी, क्योंकि जेएस पार्सर 'फ़ंक्शन' कीवर्ड देखेगा और मान लें कि आप फ़ॉर्म का फ़ंक्शन स्टेटमेंट शुरू कर रहे हैं:

function doSomething() {
}

... और आपके पास फ़ंक्शन नाम के बिना फ़ंक्शन स्टेटमेंट नहीं हो सकता है।

फ़ंक्शन एक्सप्रेशन और फ़ंक्शन स्टेटमेंट दो अलग-अलग संरचनाएं हैं जिन्हें बहुत अलग तरीकों से संभाला जाता है। दुर्भाग्यवश वाक्यविन्यास लगभग समान है, इसलिए यह प्रोग्रामर को भ्रमित नहीं कर रहा है, यहां तक ​​कि पार्सर को यह भी कहने में कठिनाई है कि आपका मतलब क्या है!




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




पहले कोष्ठक, यदि आप करेंगे, संचालन के आदेश के लिए हैं। फ़ंक्शन परिभाषा के आस-पास कोष्ठक के सेट का 'परिणाम' फ़ंक्शन स्वयं ही है, जो वास्तव में, कोष्ठक का दूसरा सेट निष्पादित करता है।

यह क्यों उपयोगी है, मैं कोई विचार करने के लिए एक जावास्क्रिप्ट जादूगर के लिए पर्याप्त नहीं हूँ। : पी




कार्यक्रम:

function () {}

कुछ भी नहीं देता (या अपरिभाषित)।

कभी-कभी हम इसे एक फ़ंक्शन को कॉल करना चाहते हैं जैसे हम इसे बनाते हैं। आप इसे आजमा सकते हैं:

function () {}()

लेकिन इसके परिणामस्वरूप SyntaxError

का उपयोग करना ! फ़ंक्शन से पहले ऑपरेटर इसे अभिव्यक्ति के रूप में माना जाता है, इसलिए हम इसे कॉल कर सकते हैं:

!function () {}()

यह फ़ंक्शन के रिटर्न वैल्यू के विपरीत बुलियन को भी वापस कर देगा, इस मामले में true , क्योंकि !undefined true । यदि आप कॉल का परिणाम होने के लिए वास्तविक वापसी मूल्य चाहते हैं, तो इसे इस तरह से करने का प्रयास करें:

(function () {})()




javascript syntax