यदि "द्वारा निष्पादित नहीं किया जाएगा" आप का मतलब है "जब एक से अधिक बार कॉल किया जाता है तो कुछ भी नहीं होगा", आप एक क्लोजर बना सकते हैं:
var something = (function() {
var executed = false;
return function() {
if (!executed) {
executed = true;
// do something
}
};
})();
something(); // "do something" happens
something(); // nothing happens
@Vladloffe (अब हटाए गए) द्वारा एक टिप्पणी के जवाब में: एक वैश्विक चर के साथ, अन्य कोड "निष्पादित" ध्वज (जो भी नाम आप इसके लिए चुनते हैं) के मूल्य को रीसेट कर सकते हैं। बंद होने के साथ, अन्य कोड के पास ऐसा करने का कोई तरीका नहीं है, या तो गलती से या जानबूझकर।
जैसा कि अन्य उत्तर यहां बताते हैं, कई पुस्तकालयों (जैसे कि अंडरस्कोर और रामदा ) में एक छोटी उपयोगिता फ़ंक्शन है (आमतौर पर नाम once()
[*] ) है जो एक फ़ंक्शन को एक तर्क के रूप में स्वीकार करता है और एक और फ़ंक्शन देता है जो आपूर्ति फ़ंक्शन को बिल्कुल एक बार कॉल करता है, भले ही कैसे भी हो। कई बार दिए गए फंक्शन को कहा जाता है। लौटाया गया फ़ंक्शन पहले दिए गए फ़ंक्शन द्वारा लौटाए गए मूल्य को भी कैश करता है और बाद की कॉल पर वापस करता है।
हालाँकि, यदि आप इस तरह की थर्ड-पार्टी लाइब्रेरी का उपयोग नहीं कर रहे हैं, लेकिन फिर भी ऐसा यूटिलिटी फंक्शन चाहते हैं (न कि ऊपर दिए गए नॉन सॉल्यूशन के बजाय), इसे लागू करना काफी आसान है। मैंने जो सबसे अच्छा संस्करण देखा है, वह डेविड वॉल्श द्वारा पोस्ट किया गया है :
function once(fn, context) {
var result;
return function() {
if (fn) {
result = fn.apply(context || this, arguments);
fn = null;
}
return result;
};
}
मैं बदलने के लिए इच्छुक हो जाएगा fn = null;
करने के लिए fn = context = null;
। एक context
बार fn
बुलाए जाने के संदर्भ को बनाए रखने के लिए बंद करने का कोई कारण नहीं है ।
[*] जागरूक रहें, हालांकि, अन्य पुस्तकालयों, जैसे कि jQuery के इस Drupal एक्सटेंशन के नाम पर एक फ़ंक्शन हो सकता है, once()
जो कुछ अलग करता है।