questions - javascript programs




समापन शैली में अंतर क्या है (4)

@ लार्स: पहले भी एक निष्पादित कर रहा है। इसे एक नामित निर्माता के साथ तुलना करें:

function Blah() {
    alert('blah');
}
new Bla();

यह वास्तव में कोड निष्पादित भी है यह अनाम निर्माता के लिए भी जाता है ...

लेकिन यह सवाल नहीं था ;-)

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

new function() { 
  var code...
}

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

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

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


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

<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


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

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

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





javascript