2010-05-12 13 views
19
window.addEventListener('unload', function(e) 
{ 
    MyClass.shutdown(); 
    window.removeEventListener('unload', /* how to refer to this function? */); 
}, false); 
+1

बाद में –

उत्तर

20

नाम अपने कार्य करते हैं।

function f(e) { 
    MyClass.shutdown(); 
    window.removeEventListener('unload', f); 
} 
window.addEventListener('unload', f, false); 

संपादित मुझे लगता है कि यह भी काम करेगा। अच्छा बिंदु कोबी!

window.addEventListener('unload', function f(e) 
{ 
    MyClass.shutdown(); 
    window.removeEventListener('unload', f); 
}, false); 
+0

अच्छी तरह से मैं उस बारे में जानता हूं, लेकिन मैं अज्ञात फ़ंक्शन को नाम से बदलना नहीं चाहता ... मुझे अब जिस तरह से पसंद है। – Pablo

+3

@ माइकल - फ़ंक्शन को बंद करने के भीतर स्थानीय रूप से नामित किया जा सकता है। यह एक छोटा सा बदलाव है। – Kobi

+3

@ माइकल: आपके फ़ंक्शन का नामकरण * अब तक * इसे कॉल करने की अनुमति देने का सबसे अच्छा तरीका है। 'Arguments.callee' का उपयोग करना अधिकांश मौजूदा कार्यान्वयन (2x और 10x के बीच - हां, वास्तव में) पर नाटकीय रूप से धीमा है, और ईसीएमएस्क्रिप्ट के नए "सख्त मोड" के साथ काम नहीं करेगा (जिसे आप ढूंढ सकते हैं कि आप इसका उपयोग शुरू करना चाहते हैं एक समय पर)। अब, प्रदर्शन पहलू 'ऑनलोड' हैंडलर को खोलने के लिए कोई फर्क नहीं पड़ता है, लेकिन केवल यह इंगित करता है कि यदि आप कहीं और पैटर्न लागू करते हैं। –

11

Howto उपयोग प्रत्यावर्तन बेनामी कार्य पर

चलें कहते हैं कि हम एक गुमनाम भाज्य समारोह है और हम इसे रिकर्सिवली क्या करना चाहते हैं पासिंग। हम किसी नाम के बिना फ़ंक्शन कैसे कॉल करते हैं? अच्छी तरह से जावास्क्रिप्ट में arguments.callee प्रॉपर्टी में वर्तमान में निष्पादित फ़ंक्शन के लिए एक पॉइंटर होता है जिसका अर्थ है कि एक अनाम फ़ंक्शन वास्तव में स्वयं को कॉल कर सकता है।

alert((function(n){ if(n <= 1){return 1;}else{return n*arguments.callee(n-1);}})(10)); 

स्रोत: http://www.hunlock.com/blogs/Functional_Javascript

+2

खोज के लिए प्रश्न के शीर्षक में सुधार कर लें, ताकि यह होगा सिर्फ 'window.removeEventListener ('अनलोड', arguments.calee) '? – Pablo

+0

@ माइकल: दो "एल" के साथ, लेकिन हाँ। लेकिन * सामान्य * में यह करने का एक अच्छा तरीका नहीं है; ykaganovich के जवाब पर मेरी टिप्पणी देखें। –

+1

यह जवाब है! मैं वास्तव में चाहता हूं कि यह वर्तमान में मौजूद एक के बजाय चुना जाएगा। –

1

मैं इस प्रयास नहीं किया है, लेकिन कैसे MyClass में ही removeEventListener विधि कॉल ले जाने के बारे। विधि अज्ञात नहीं होगी, लेकिन आप वैश्विक नामस्थान को प्रदूषित नहीं करेंगे और यह उस वर्ग का हिस्सा होगा जो इसे जोड़ रहा है। आप इसे "निजी" भी बना सकते हैं। मुझे यकीन है कि अपनी शैली है क्या नहीं कर रहा हूँ, लेकिन मैं इसे कुछ इस तरह लिखना चाहते हैं:

var MyClass = function(){ 
    var self = this; 
    self.shutdown = function(){ 
    window.removeEventListener('unload',self.shutdown,false); 
    }; 
    self.initialize = function() { 
    window.addEventListener('unload',self.shutdown,false); 
    }; 
    return self; 
}; 
var myObject = new MyClass(); 
myObject.initialize(); 

मैं यह क्या MyClass करता है पर निर्भर करता है लगता है और आप इसे कैसे इस्तेमाल करते हैं।

2

arguments वस्तु हमेशा बुलाया समारोह को संदर्भित करता है के callee संपत्ति:

window.addEventListener('unload', function(e) 
{ 
    MyClass.shutdown(); 
    window.removeEventListener('unload', arguments.callee); 
}, false); 

देखें: MDC: callee

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