अनाम फ़ंक्शन (फ़ंक्शन () {…}) () ”जैसे संपूर्ण जावास्क्रिप्ट फ़ाइलों को लपेटने का उद्देश्य क्या है?


584

मैं हाल ही में जावास्क्रिप्ट का एक बहुत कुछ पढ़ रहा हूं और मैं देख रहा हूं कि पूरी फ़ाइल को .js फ़ाइलों में निम्न की तरह लपेटा जाता है जिसे आयात किया जाना है।

(function() {
    ... 
    code
    ...
})();

निर्माण कार्यों के एक साधारण सेट के बजाय ऐसा करने का क्या कारण है?


6
चूंकि मुझे लगता है कि यह बहुत से लोगों द्वारा उपयोग किया जाएगा, कृपया समापन को मत भूलना;
डीजी

5
इस टेक्निक को "IIFE" कहते हैं। इसका तात्पर्य त्वरित रूप से शामिल किए गए फंक्शन एक्सप्रेशन en.wikipedia.org/wiki/Immediately-invoked_function_expression
एड्रियन बी

जवाबों:


786

यह आमतौर पर नाम स्थान (बाद में देखें) और सदस्य कार्यों और / या चर की दृश्यता को नियंत्रित करता है। इसे एक वस्तु परिभाषा की तरह समझें। इसके लिए तकनीकी नाम एक तत्काल आमंत्रित फ़ंक्शन अभिव्यक्ति (IIFE) है। jQuery प्लगइन्स आमतौर पर इस तरह लिखे जाते हैं।

जावास्क्रिप्ट में, आप फ़ंक्शन को घोंसला कर सकते हैं। तो, निम्नलिखित कानूनी है:

function outerFunction() {
   function innerFunction() {
      // code
   }
}

अब आप कॉल कर सकते हैं outerFunction(), लेकिन की भयावहता के innerFunction()दायरे तक सीमित है outerFunction(), जिसका अर्थ है कि यह निजी है outerFunction()। यह मूल रूप से जावास्क्रिप्ट में चर के समान सिद्धांत का अनुसरण करता है:

var globalVariable;

function someFunction() {
   var localVariable;
}

तदनुसार:

function globalFunction() {

   var localFunction1 = function() {
       //I'm anonymous! But localFunction1 is a reference to me!
   };

   function localFunction2() {
      //I'm named!
   }
}

उपरोक्त परिदृश्य में, आप globalFunction()कहीं से भी कॉल कर सकते हैं , लेकिन आप कॉल localFunction1या नहीं कर सकते localFunction2

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

(function() {
   var private_var;

   function private_function() {
     //code
   }
})();

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

function globalFunction() {
    // code
}
globalFunction();

व्यवहार काफी हद तक एक महत्वपूर्ण अंतर को छोड़कर एक ही होगा: जब आप एक IIFE का उपयोग करते हैं तो वैश्विक गुंजाइश को प्रदूषित करने से बचते हैं (परिणाम के रूप में इसका अर्थ यह भी है कि आप कई बार फ़ंक्शन को लागू नहीं कर सकते क्योंकि इसमें कोई नाम नहीं है, लेकिन चूंकि यह फ़ंक्शन केवल तब निष्पादित किया जाना चाहिए जब यह वास्तव में कोई समस्या नहीं है)।

IIFE के साथ साफ बात यह है कि आप अंदर की चीजों को भी परिभाषित कर सकते हैं और केवल उन हिस्सों को उजागर कर सकते हैं जो आप बाहरी दुनिया को चाहते हैं (नाम स्थान का एक उदाहरण ताकि आप मूल रूप से अपना खुद का पुस्तकालय / प्लगइन बना सकें):

var myPlugin = (function() {
 var private_var;

 function private_function() {
 }

 return {
    public_function1: function() {
    },
    public_function2: function() {
    }
 }
})()

अब आप कॉल कर सकते हैं myPlugin.public_function1(), लेकिन आप एक्सेस नहीं कर सकते private_function()! एक वर्ग की परिभाषा के समान सुंदर। इसे बेहतर समझने के लिए, मैं कुछ और पढ़ने के लिए निम्नलिखित लिंक सुझाता हूं:

संपादित करें

मैं उल्लेख करना भूल गया। उस फाइनल में (), आप अपने अंदर से कुछ भी पास कर सकते हैं। उदाहरण के लिए, जब आप jQuery प्लगइन्स बनाते हैं, तो आप इसमें jQueryया $जैसे पास करते हैं:

(function(jQ) { ... code ... })(jQuery) 

तो आप यहां क्या कर रहे हैं, एक फ़ंक्शन को परिभाषित कर रहा है जो एक पैरामीटर में लिया जाता है (जिसे jQस्थानीय चर कहा जाता है , और केवल उस फ़ंक्शन के लिए जाना जाता है)। फिर आप फ़ंक्शन को सेल्फ-इनवॉइस कर रहे हैं और एक पैरामीटर में पास कर रहे हैं (जिसे भी कहा जाता है jQuery, लेकिन यह बाहरी दुनिया से है और वास्तविक jQuery के लिए एक संदर्भ है)। ऐसा करने के लिए कोई दबाव की आवश्यकता नहीं है, लेकिन कुछ फायदे हैं:

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

पहले मैंने वर्णन किया कि ये फ़ंक्शन स्टार्टअप पर स्वचालित रूप से कैसे चलते हैं, लेकिन यदि वे स्वचालित रूप से चलते हैं तो कौन तर्क में गुजर रहा है? यह तकनीक मानती है कि आपके लिए आवश्यक सभी मापदंडों को पहले से ही वैश्विक चर के रूप में परिभाषित किया गया है। तो अगर jQuery पहले से ही एक वैश्विक चर के रूप में परिभाषित नहीं किया गया था तो यह उदाहरण काम नहीं करेगा। जैसा कि आप अनुमान लगा सकते हैं, इसके प्रारंभ के दौरान jquery.js एक चीज़ एक 'jQuery' वैश्विक चर को परिभाषित करती है, साथ ही इसके अधिक प्रसिद्ध '$' वैश्विक चर को भी परिभाषित करती है, जो इस कोड को jQuery के शामिल होने के बाद काम करने की अनुमति देता है।


14
बहुत अच्छा, मैं नाम स्थान को अच्छी तरह से समझता हूं, लेकिन मैंने आपका बहुत अंतिम उदाहरण देखा है और यह पता नहीं लगा सका कि लोग क्या हासिल करने की कोशिश कर रहे थे। यह वास्तव में चीजों को साफ करता है।
एंड्रयू कोउ

34
बहुत बढ़िया पोस्ट। बहुत बहुत धन्यवाद।
डैरेन

4
मुझे लगता है कि एक अग्रणी और अनुगामी अर्धविराम जोड़ना ';' उदाहरण को पूर्ण ;(function(jQ) { ... code ... })(jQuery);बनाता है - यदि कोई व्यक्ति अपनी स्क्रिप्ट में अर्धविराम छोड़ता है तो यह आपका नहीं टूटेगा, खासकर यदि आप अपनी स्क्रिप्ट को अन्य के साथ संक्षिप्त और संक्षिप्त करने की योजना बनाते हैं।
तारास एलेन

3
अच्छा पोस्ट, मुझे निजी चर पर जोर पसंद है। मुझे मॉड्यूल-पैटर्न / क्लोजर (public_function1 और public_function2) पर ओपनिंग पसंद है और आप चर कैसे पास करते हैं, भले ही थोड़ा गुंजाइश से बाहर हो यह एक अच्छा परिचय है। मैंने एक उत्तर भी जोड़ा, यह जो मैं मानता हूं कि वाक्य कथन बनाम फ़ंक्शन अभिव्यक्ति और जो मुझे लगता है कि "सिर्फ एक सम्मेलन" बनाम "इस परिणाम को प्राप्त करने का एकमात्र तरीका है" के बीच वाक्यविन्यास और अंतर की जड़ें हैं।
बी

4
महान पोस्ट, मुझे लगता है कि स्वयं क्रियान्वयन समारोह में चर कैसे फायदेमंद हो सकता है, इस पर और अधिक। स्व निष्पादित कार्य में संदर्भ साफ है - कोई डेटा नहीं। आप ऐसा करके संदर्भ में पारित कर सकते हैं, (function (context) { ..... })(this)जो तब आपको कुछ भी जो आपको पसंद है उसे मूल संदर्भ में संलग्न करने की अनुमति देता है।
कैलम लिनिंगटन

79

संक्षेप में

सारांश

अपने सरलतम रूप में, इस तकनीक का उद्देश्य फ़ंक्शन स्कोप के अंदर कोड को लपेटना है

यह मदद करता है की संभावना कम हो जाती है:

  • अन्य अनुप्रयोगों / पुस्तकालयों के साथ टकराव
  • प्रदूषणकारी श्रेष्ठ (वैश्विक सबसे अधिक संभावना) क्षेत्र

यह नहीं करता है का पता लगाने जब दस्तावेज़ तैयार है - यह किसी तरह का नहीं है document.onloadऔर न हीwindow.onload

यह आमतौर पर Immediately Invoked Function Expression (IIFE)या के रूप में जाना जाता है Self Executing Anonymous Function

कोड समझाया गया

var someFunction = function(){ console.log('wagwan!'); };

(function() {                   /* function scope starts here */
  console.log('start of IIFE');

  var myNumber = 4;             /* number variable declaration */
  var myFunction = function(){  /* function variable declaration */
    console.log('formidable!'); 
  };
  var myObject = {              /* object variable declaration */
    anotherNumber : 1001, 
    anotherFunc : function(){ console.log('formidable!'); }
  };
  console.log('end of IIFE');
})();                           /* function scope ends */

someFunction();            // reachable, hence works: see in the console
myFunction();              // unreachable, will throw an error, see in the console
myObject.anotherFunc();    // unreachable, will throw an error, see in the console

ऊपर दिए गए उदाहरण में, फ़ंक्शन में परिभाषित कोई भी चर (यानी का उपयोग करके घोषित किया गया var) "निजी" होगा और फ़ंक्शन के दायरे में केवल सुलभ होगा (जैसा कि विविन पालीथ इसे कहते हैं)। दूसरे शब्दों में, ये चर फ़ंक्शन के बाहर दिखाई नहीं देते / पहुंच योग्य नहीं होते हैं। लाइव डेमो देखें

जावास्क्रिप्ट में फंक्शन स्कूपिंग है। "फ़ंक्शन में परिभाषित पैरामीटर और चर फ़ंक्शन के बाहर दिखाई नहीं देते हैं, और फ़ंक्शन के भीतर कहीं भी परिभाषित एक चर फ़ंक्शन के भीतर हर जगह दिखाई देता है।" ("जावास्क्रिप्ट: द गुड पार्ट्स" से)।


अधिक जानकारी

वैकल्पिक कोड

अंत में, पहले पोस्ट किया गया कोड निम्नानुसार भी किया जा सकता है:

var someFunction = function(){ console.log('wagwan!'); };

var myMainFunction = function() {
  console.log('start of IIFE');

  var myNumber = 4;
  var myFunction = function(){ console.log('formidable!'); };
  var myObject = { 
    anotherNumber : 1001, 
    anotherFunc : function(){ console.log('formidable!'); }
  };
  console.log('end of IIFE');
};

myMainFunction();          // I CALL "myMainFunction" FUNCTION HERE
someFunction();            // reachable, hence works: see in the console
myFunction();              // unreachable, will throw an error, see in the console
myObject.anotherFunc();    // unreachable, will throw an error, see in the console

लाइव डेमो देखें


जड़

Iteration 1

एक दिन, किसी ने शायद सोचा कि "myMainFunction 'नामकरण से बचने का एक तरीका होना चाहिए, क्योंकि हम चाहते हैं कि इसे तुरंत निष्पादित किया जाए।"

यदि आप मूल बातों पर वापस जाते हैं, तो आपको पता चलता है कि:

  • expression: एक मूल्य का मूल्यांकन करने वाला कुछ। अर्थात3+11/x
  • statement: कुछ करने के लिए कोड की लाइन (एस) लेकिन यह एक मूल्य का मूल्यांकन नहीं करता है । अर्थातif(){}

इसी तरह, फंक्शन एक्सप्रेशन एक वैल्यू का मूल्यांकन करते हैं। और एक परिणाम (मुझे लगता है!) यह है कि उन्हें तुरंत लागू किया जा सकता है:

 var italianSayinSomething = function(){ console.log('mamamia!'); }();

तो हमारा और अधिक जटिल उदाहरण बन जाता है:

var someFunction = function(){ console.log('wagwan!'); };

var myMainFunction = function() {
  console.log('start of IIFE');

  var myNumber = 4;
  var myFunction = function(){ console.log('formidable!'); };
  var myObject = { 
    anotherNumber : 1001, 
    anotherFunc : function(){ console.log('formidable!'); }
  };
  console.log('end of IIFE');
}();

someFunction();            // reachable, hence works: see in the console
myFunction();              // unreachable, will throw an error, see in the console
myObject.anotherFunc();    // unreachable, will throw an error, see in the console

लाइव डेमो देखें

Iteration 2

अगला कदम यह है कि " var myMainFunction =अगर हमारे पास इसका उपयोग नहीं है तो भी क्यों है !"।

इसका उत्तर सरल है: इसे हटाने का प्रयास करें, जैसे नीचे:

 function(){ console.log('mamamia!'); }();

लाइव डेमो देखें

यह काम नहीं करेगा क्योंकि "फ़ंक्शन घोषणाएं अदृश्य नहीं हैं"

चाल यह है कि हटाकर var myMainFunction =हमने फ़ंक्शन अभिव्यक्ति को एक फ़ंक्शन घोषणा में बदल दिया । इस पर अधिक जानकारी के लिए "संसाधन" में लिंक देखें।

अगला सवाल यह है कि "मैं इसे फंक्शन एक्सप्रेशन के रूप में क्यों नहीं रख सकता var myMainFunction =?

इसका उत्तर "आप कर सकते हैं", और वास्तव में कई तरीके हैं जो आप ऐसा कर सकते हैं: एक +, एक !, एक -, या शायद कोष्ठक की एक जोड़ी में लपेटकर (जैसा कि अब यह सम्मेलन द्वारा किया गया है), और अधिक मैं मानता हूं। उदाहरण के रूप में:

 (function(){ console.log('mamamia!'); })(); // live demo: jsbin.com/zokuwodoco/1/edit?js,console.

या

 +function(){ console.log('mamamia!'); }(); // live demo: jsbin.com/wuwipiyazi/1/edit?js,console

या

 -function(){ console.log('mamamia!'); }(); // live demo: jsbin.com/wejupaheva/1/edit?js,console

एक बार प्रासंगिक संशोधन को एक बार हमारे "वैकल्पिक कोड" में जोड़ दिया जाता है, तो हम उसी कोड पर लौटते हैं, जैसा "कोड समझाया गया" उदाहरण में उपयोग किया गया था

var someFunction = function(){ console.log('wagwan!'); };

(function() {
  console.log('start of IIFE');

  var myNumber = 4;
  var myFunction = function(){ console.log('formidable!'); };
  var myObject = { 
    anotherNumber : 1001, 
    anotherFunc : function(){ console.log('formidable!'); }
  };
  console.log('end of IIFE');
})();

someFunction();            // reachable, hence works: see in the console
myFunction();              // unreachable, will throw an error, see in the console
myObject.anotherFunc();    // unreachable, will throw an error, see in the console

इसके बारे में और पढ़ें Expressions vs Statements:


डेमिस्टिफ़ाइंग स्कोप्स

एक बात आश्चर्यचकित कर सकती है कि "क्या होता है जब आप फ़ंक्शन के अंदर वेरिएबल को ठीक से परिभाषित नहीं करते हैं - अर्थात इसके बजाय एक सरल असाइनमेंट करते हैं?"

(function() {
  var myNumber = 4;             /* number variable declaration */
  var myFunction = function(){  /* function variable declaration */
    console.log('formidable!'); 
  };
  var myObject = {              /* object variable declaration */
    anotherNumber : 1001, 
    anotherFunc : function(){ console.log('formidable!'); }
  };
  myOtherFunction = function(){  /* oops, an assignment instead of a declaration */
    console.log('haha. got ya!');
  };
})();
myOtherFunction();         // reachable, hence works: see in the console
window.myOtherFunction();  // works in the browser, myOtherFunction is then in the global scope
myFunction();              // unreachable, will throw an error, see in the console

लाइव डेमो देखें

मूल रूप से, यदि एक चर जिसे इसके मौजूदा दायरे में घोषित नहीं किया गया था, उसे एक मान दिया गया है, तो "एक स्कोप श्रृंखला दिखाई देती है जब तक कि यह वैरिएबल को नहीं ढूंढता या वैश्विक स्कोप को हिट नहीं करता है (जिस बिंदु पर यह इसे बनाएगा)"।

जब एक ब्राउज़र वातावरण (बनाम सर्वर नेटवर्क जैसे नोडज) में वैश्विक स्कोप को windowऑब्जेक्ट द्वारा परिभाषित किया जाता है। इसलिए हम कर सकते हैं window.myOtherFunction()

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

ध्यान दें:

  • जावास्क्रिप्ट में नहीं है block scope(अपडेट: ईएस 6 में जोड़ा गया स्थानीय गुंजाइश ब्लॉक करें ।)
  • जावास्क्रिप्ट केवल function scopeऔर global scope( windowएक ब्राउज़र वातावरण में गुंजाइश)

इसके बारे में और पढ़ें Javascript Scopes:


साधन


अगला कदम

एक बार जब आप इस IIFEअवधारणा को प्राप्त करते हैं , तो यह होता है module pattern, जो आमतौर पर इस IIFE पैटर्न का लाभ उठाकर किया जाता है। मज़े करो :)


बहुत मददगार। आपका बहुत बहुत धन्यवाद!
क्रिस्टोफर हेलगेलिन हल्द

अच्छा, मुझे डेमो संस्करण पसंद है :)
Fabrizio Bertoglio

इतनी बढ़िया व्याख्या। धन्यवाद!
विक्रम खेमलानी

26

एक ब्राउज़र में जावास्क्रिप्ट में वास्तव में प्रभावी स्कोप के एक जोड़े होते हैं: फ़ंक्शन गुंजाइश और वैश्विक गुंजाइश।

यदि कोई चर कार्य क्षेत्र में नहीं है, तो यह वैश्विक दायरे में है। और वैश्विक चर आमतौर पर खराब होते हैं, इसलिए यह एक पुस्तकालय के चर को अपने पास रखने के लिए एक निर्माण है।


1
लेकिन क्या कंस्ट्रक्टर फ़ंक्शन अपने स्वयं के चर के लिए गुंजाइश प्रदान नहीं करता है?
एंड्रयू कोउ

1
हां, इस लाइब्रेरी में परिभाषित प्रत्येक फ़ंक्शन अपने स्वयं के स्थानीय वेरिएबल्स को परिभाषित कर सकता है, लेकिन इससे वेरिएबल्स को लाइब्रेरी के बाहर लीक किए बिना फ़ंक्शंस के बीच साझा किया जा सकता है
गैरेथ

@ गैरेथ, इसलिए यह एक दायरे में "वैश्विक" चर के लिए अनुमति देता है (
फ्रांसिस्को प्रेसेनिया

2
@FranciscoPresencia "एक दायरे में वैश्विक" एक उपयोगी वाक्यांश नहीं है, क्योंकि यह मूल रूप से सिर्फ "गुंजाइश" का मतलब है। "ग्लोबल" स्कोप का पूरा बिंदु यह है कि यह विशेष रूप से स्कोप है जो अन्य सभी स्कोप तक पहुंच है।
गारेथ

19

इसे क्लोजर कहा जाता है। यह मूल रूप से फ़ंक्शन के अंदर कोड को सील करता है ताकि अन्य पुस्तकालय इसके साथ हस्तक्षेप न करें। यह संकलित भाषाओं में नाम स्थान बनाने के समान है।

उदाहरण। मान लीजिए मैं लिखता हूं:

(function() {

    var x = 2;

    // do stuff with x

})();

अब अन्य पुस्तकालय xमेरे पुस्तकालय में उपयोग किए जाने वाले चर का उपयोग नहीं कर सकते हैं ।


7
अपनी शब्दावली के साथ सावधान। नाम स्थान का तात्पर्य है कि नाम स्थान (आमतौर पर एक उपसर्ग का उपयोग करके) को संबोधित करके चर को बाहर से एक्सेस किया जा सकता है। जबकि जावास्क्रिप्ट में यह संभव है कि यहां क्या प्रदर्शन नहीं किया गया है
गैरेथ

मैं मानता हूँ यह है वास्तव में नहीं एक नाम स्थान की तरह, हालांकि, आप इसी तरह की सुविधा गुण है जो आप प्रचार करना चाहते हैं के साथ एक वस्तु लौटाएँ प्रदान कर सकते हैं: (function(){ ... return { publicProp1: 'blah' }; })();। स्पष्ट रूप से नाम स्थान के समानांतर नहीं, लेकिन यह इस तरह से सोचने में मदद कर सकता है।
जोएल

आपके उदाहरण में x अभी भी एक निजी चर है ... आप इसे IIFE में लपेटने के बावजूद। आगे बढ़ें और फ़ंक्शन के बाहर x तक पहुंचने का प्रयास करें, आप नहीं कर सकते ..
RayLoveless

आपकी बात मान्य नहीं है। निम्न फ़ंक्शन में भी अन्य लाइब्रेरीज़ x तक नहीं पहुँच सकते हैं। function () {var x = 2}
RayLoveless

@RayLoveless मैं सहमत हूँ। मैं उस दावे का खंडन नहीं करता। वास्तव में, मैंने इस उत्तर के अंतिम वाक्य के रूप में वही दावा किया है।
जोएल

8

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

   navigator.html5={
     canvas: (function(){
      var dc= document.createElement('canvas');
      if(!dc.getContext) return 0;
      var c= dc.getContext('2d');
      return typeof c.fillText== 'function'? 2: 1;
     })(),
     localStorage: (function(){
      return !!window.localStorage;
     })(),
     webworkers: (function(){
      return !!window.Worker;
     })(),
     offline: (function(){
      return !!window.applicationCache;
     })()
    }

इससे क्या होता है !! करना?
1.21 गीगावाट

!! एक मूल्य को यह बूलियन (सच्चा / गलत) प्रतिनिधित्व करता है।
लियाम

7

वैरिएबल को स्थानीय रखने के अलावा, एक बहुत ही काम में उपयोग किया जाता है जब एक ग्लोबल वैरिएबल का उपयोग करके लाइब्रेरी लिख रहा है, तो आप इसे लाइब्रेरी के भीतर उपयोग करने के लिए एक छोटा वेरिएबल नाम दे सकते हैं। इसका उपयोग अक्सर jQuery प्लगइन्स लिखने में किया जाता है, क्योंकि jQuery आपको jQuery.noConflict () का उपयोग करके $ चर को jQuery की ओर अक्षम करने की अनुमति देता है। यदि यह अक्षम है, तो आपका कोड अभी भी $ का उपयोग कर सकता है और यदि आप बस करते हैं तो नहीं टूटेंगे:

(function($) { ...code...})(jQuery);

3
  1. एक ही विंडो में अन्य तरीकों / पुस्तकालयों के साथ टकराव से बचने के लिए,
  2. ग्लोबल स्कोप से बचें, इसे लोकल स्कोप बनाएं,
  3. डिबगिंग को तेज़ करने के लिए (स्थानीय स्कोप),
  4. जावास्क्रिप्ट में केवल कार्यक्षेत्र है, इसलिए यह कोडों के संकलन में भी मदद करेगा।

1

हमें यह सुनिश्चित करने के लिए कि फ़ंक्शन को "सख्त मोड" में निष्पादित किया जाना चाहिए, स्कोप फ़ंक्शन में 'उपयोग सख्त' का भी उपयोग करना चाहिए। नमूना कोड नीचे दिखाया गया है

(function() {
    'use strict';

    //Your code from here
})();

हमें सख्त का उपयोग क्यों करना चाहिए?
nbro

इस लेख की जाँच करें: stackoverflow.com/questions/1335851/…
नेहा जैन

वास्तव में सवाल का जवाब नहीं देता है!
प्रीतम बनर्जी

प्रीतम, इसका एक अच्छा अभ्यास है। कृपया किसी भी जवाब को वोट करने से पहले उचित शोध करें
नेहा जैन

1
'सख्त का उपयोग करें' खराब प्रोग्रामर को खुद से बचाता है। और चूंकि अधिकांश प्रोग्रामर खराब प्रोग्रामर होते हैं, यह उन्हें उन चीजों को करने से रोकने में मदद करता है जो उन्हें निश्चित रूप से नहीं करनी चाहिए और कोड की तेज़ी से डूबने वाली गड़बड़ी में समाप्त होती है।
मैट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.