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



Answers

एंडी ह्यूम 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/ पर उत्कृष्ट ट्यूटोरियल को समझने का प्रयास करें, जहां मैंने बहुत सी सीखा।

Question

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

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

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

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

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

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




एंडी ह्यूम और अन्य ने क्या कहा है, इसका पालन करने के लिए झटके:

अज्ञात फ़ंक्शन के आस-पास '()' ईसीएमए स्पेक की धारा 11.1.6 में परिभाषित 'ग्रुपिंग ऑपरेटर' है: http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf

दस्तावेज़ों से verbatim लिया:

11.1.6 ग्रुपिंग ऑपरेटर

उत्पादन PrimaryExpression : ( अभिव्यक्ति ) का मूल्यांकन निम्नानुसार किया जाता है:

  1. अभिव्यक्ति का मूल्यांकन करने के परिणाम लौटें। यह प्रकार संदर्भ का हो सकता है।

इस संदर्भ में फ़ंक्शन को अभिव्यक्ति के रूप में माना जाता है।




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

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




Related