javascript questions समापन शैली में अंतर क्या है




javascript programs (5)

वे कोड ब्लॉक को निष्पादित करके दोनों बंद कर देते हैं शैली की बात यह है कि मैं कुछ कारणों के लिए दूसरी पसंद करता हूं:

यह पहली बार स्पष्ट रूप से स्पष्ट नहीं है कि कोड वास्तव में निष्पादित होगा; रेखा ऐसा लगता है कि यह एक कंसट्रक्टर के रूप में निष्पादित करने के बजाय, एक नया फ़ंक्शन बना रहा है , लेकिन ऐसा नहीं है कि वास्तव में क्या हो रहा है। उस कोड से बचें, जो ऐसा कर रहा है ऐसा नहीं करता!

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

जावास्क्रिप्ट में दो लोकप्रिय बंद शैलियों हैं पहले मैं अनाम कन्स्ट्रक्टर को कॉल करता हूं:

new function() { 
  var code...
}

और इनलाइन निष्पादित कार्य :

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

क्या उन दोनों के बीच व्यवहार में अंतर है? क्या दूसरे के ऊपर एक "बेहतर" है?


दूसरा उदाहरण इसे बनाने के बाद फ़ंक्शन निष्पादित करेगा।

संपादित करें: यह वास्तव में सच नहीं है


हां, दोनों के बीच मतभेद हैं I

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

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

उदाहरण:

<html>
<body>
<script type="text/javascript">

new function() { 
a = "Hello";
alert(a + " Inside Function");
};

alert(a + " Outside Function");

(function() { 
var b = "World";
alert(b + " Inside Function");
})();

alert(b + " Outside Function");
</script>
</body>
</html>

उपरोक्त कोड में आउटपुट कुछ ऐसा है:

नमस्कार अंदर फ़ंक्शन
हेलो आउट फंक्शन
विश्व अंदर फ़ंक्शन

... फिर, आपको एक त्रुटि मिलती है क्योंकि 'बी' को फ़ंक्शन के बाहर नहीं परिभाषित किया जाता है!

इस प्रकार, मुझे विश्वास है कि दूसरी विधि बेहतर है ... सुरक्षित!


अच्छा, मैंने इस तरह एक पृष्ठ बनाया है:

<html>
<body>
<script type="text/javascript">
var a = new function() { 
  alert("method 1");

  return "test";
};

var b = (function() {
  alert("method 2");

  return "test";
})();

alert(a);  //a is a function
alert(b);  //b is a string containing "test"

</script>
</body>
</html>

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


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

मूल रूप से व्यवहार

new expression

प्रभावी रूप से इसके बराबर है

var tempObject = {};
var result = expression.call(tempObject);
if (result is not an object)
    result = tempObject;

हालाँकि अस्थायी वस्तु के परिणाम और परिणाम क्षणिक मूल्य हैं जो आप कभी नहीं देख सकते हैं (वे दुभाषिया में कार्यान्वयन विवरण हैं), और "एक ऑब्जेक्ट नहीं है" जांच करने के लिए कोई जेएस तंत्र नहीं है।

कंसल्टेंट के लिए इस ऑब्जेक्ट को बनाने की आवश्यकता के कारण मोटे तौर पर "नया फ़ंक्शन () {..}" विधि धीमी हो जाएगी।

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

संपादित करें: एक बात मुझे एहसास हुआ कि मैं इस से चूक गया है कि tempObject expression प्रोटोटाइप मिलेगा, उदा। ( expression.call से पहले) tempObject.__proto__ = expression.prototype





javascript