2012-06-26 12 views
10

संभव डुप्लिकेट:
How does the (function() {})() construct work and why do people use it?क्यों उपयोग करें (फ़ंक्शन() {....}());

क्यों आधुनिक JavaScript फ़ाइलों की तरह निर्माणों का उपयोग करते हैं:

(function() { 
    // some real code 
}()); 

अर्थात मैं समझता हूं कि एक अज्ञात फ़ंक्शन बनाया जा रहा है और फिर तत्काल कहा जाता है, बिना पैरामीटर पारित किए जाते हैं ... लेकिन ऐसा क्यों करें और न केवल some real code पर कॉल करें? और गोल ब्रैकेट की बाहरी जोड़ी क्या है?

विशेष रूप से मैं फ़ाइल js/start.js घूर रहा हूँ Github पर:

(function() { 
    "use strict"; 

    wooga.castle.GRID_UNIT = 48; 
    wooga.castle.IMAGES_BASE_URL = "images/entities/"; 

    (function() { 
     var style = document.createElement('div').style, 
      prefix; 
     var candidates = { 
      webkit: 'webkitTransform', 
      moz: 'MozTransform', // 'M' is uppercased 
      ms:  'msTransform', 
      o:  'oTransform', 
      '':  'transform' 
     }; 
     for (var prefix in candidates) { 
      var candidate = candidates[prefix]; 
      if ('undefined' !== typeof style[candidate]) { 
       wooga.castle.prefix = prefix; 
       wooga.castle.prefixedTransform = candidate; 
       break; 
      } 
     } 
    }()); 

    // XXX why the 2 wrapped "function"s here? XXX 

    wooga.castle.isNativeWrapper = function() { 
     var result = !wooga.castle.capabilities.desktop && !wooga.castle.capabilities.android && (! /Safari/.test(navigator.userAgent)); 
     wooga.castle.isNativeWrapper = function() { 
      return result; 
     }; 
     return result; 
    }; 
}()); 
मेरी बुनियादी जावास्क्रिप्ट और jQuery कौशल मैं उपरोक्त एकल आदेशों को समझने के साथ

, लेकिन मैं नहीं मिलता है इसलिए वे अंदर लिपटे रहे हैं कई function एस के। हम सिर्फ कॉल नहीं कर सकता:

"use strict"; 

    wooga.castle.GRID_UNIT = 48; 
    wooga.castle.IMAGES_BASE_URL = "images/entities/"; 
    var style = document.createElement('div').style, 
     prefix; 
    var candidates = { 
     webkit: 'webkitTransform', 
     moz: 'MozTransform', // 'M' is uppercased 
     ms:  'msTransform', 
     o:  'oTransform', 
     '':  'transform' 
    }; 
    for (var prefix in candidates) { 
     var candidate = candidates[prefix]; 
     if ('undefined' !== typeof style[candidate]) { 
      wooga.castle.prefix = prefix; 
      wooga.castle.prefixedTransform = candidate; 
      break; 
     } 
    } 

    wooga.castle.isNativeWrapper = !wooga.castle.capabilities.desktop && !wooga.castle.capabilities.android && (! /Safari/.test(navigator.userAgent)); 
+0

मैंने देखा है ((फ़ंक्शन() {})()) 'लेकिन नहीं (फ़ंक्शन() {}())'। – kevin628

+0

@ केविन 628: मैंने कभी नहीं देखा है ((फ़ंक्शन() {})()) '। इस तरह बहुत से '() 's है। दूसरा तरीका यह है: '(फ़ंक्शन() {})() ' –

+0

@ रॉकेट ऐसा लगता है कि वे कम से कम क्रोम में एक ही चीज़ हैं। एक में सिर्फ कम दिमागी झुकाव है() 's। मैंने आज कुछ नया सीखा। – kevin628

उत्तर

9

ऐसा इसलिए किया जाता है ताकि अंदर के कोड वैश्विक दायरे में चर के साथ हस्तक्षेप न करें।

उदाहरण के लिए:

var myLibrary = {}; 
var _privateVar = []; 

अब, इन दोनों को वैश्विक हैं। लेकिन, मुझे वह नहीं चाहिए। इसलिए, अगर मैं कोई कार्य करता हूं, तो मैं एक नया दायरा बना सकता हूं।

(function(){ 
    window.myLibrary = {}; // global 
    var _privateVar = []; // private 
}()); 
+2

ठीक है धन्यवाद, और बाहरी राउंड ब्रैकेट्स क्यों हैं (.....); 'आपके कोड में आवश्यक है? –

+4

@AlexanderFarber: बाहरी ब्रैकेट इसलिए हैं क्योंकि 'फ़ंक्शन() {}() 'एक वाक्यविन्यास त्रुटि है। बाहरी ब्रैकेट इसे अभिव्यक्ति में बदल देते हैं। –

+1

ठीक है, और मेरे कोड के अंत में 'isNativeWrapper' का डबल-रैपिंग क्यों है? –

3

यह एक बंद कहा जाता है, यह संघर्ष को रोकने के लिए इतना है कि चर और कार्यों वैश्विक क्षेत्र में घोषित नहीं कर रहे हैं कोड को संपुटित करने के लिए, बनाया गया है।

2

यह "वैश्विक दायरे के प्रदूषण" को रोकने के लिए किया जाता है। किसी अज्ञात फ़ंक्शन के साथ कोड के आस-पास के द्वारा चर केवल फ़ंक्शन के दायरे में मौजूद होते हैं जिससे वैश्विक नामस्थान में संभावित संघर्षों को रोका जा सकता है।

बाहरी कोष्ठक की जरूरत है क्योंकि function(){} अपने आप में एक घोषणा है और आप एक अभिव्यक्ति में है ताकि इसे निष्पादित करने के लिए में इसे के सामने या तो (...) या और ! जोड़कर इसे चालू करने की जरूरत है।

संबंधित मुद्दे